Swift 中的 UITableViewCell 中的 UIScrollView
UIScrollView in UITableViewCell in Swift
我正在尝试将 UIScrollView()
添加到我的 table 的其中一个单元格中。我很难弄清楚用什么方法来放置滚动视图的代码。
我在我的应用程序的其他地方有一个滚动视图,这是我用来转移到我的 UITableView()
视图的代码,我猜它应该是:
var page = Int()
var pageViews: [UIImageView?] = []
var sixPlusImages = [
UIImage(named: "Glance 5.5"),
UIImage(named: "Currencies 5.5"),
UIImage(named: "Swipe 5.5"),
UIImage(named: "Format 5.5"),
UIImage(named: "Search 5.5")
]
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:AppImagesTableViewCell = self.appTableView.dequeueReusableCellWithIdentifier("appImages", forIndexPath: indexPath) as! AppImagesTableViewCell
return cell
}
func loadPage(page: Int) {
let cell = appTableView.cellForRowAtIndexPath(NSIndexPath(index: 0))
if page < 0 || page >= pageViews.count {
return
}
if let pageView = pageViews[page] {
return
} else {
var imageFrame = CGRect(x: (cell.scrollView.bounds.width * CGFloat(page)) + 5, y: 0, width: (cell.scrollView.bounds.width) - 10, height: 40)
let imageView = UIImageView()
imageView.contentMode = .ScaleAspectFit
imageView.frame = imageFrame
imageView.image = sixPlusImages[page]
cell.scrollView.addSubview(imageView)
}
pageViews[page] = imageView
}
func purgePage(page: Int) {
if page < 0 || page >= sixPlusImages.count {
return
}
if let pageView = pageViews[page] {
pageView.removeFromSuperview()
pageViews[page] = nil
}
}
func loadVisiblePages() {
let pageWidth = cell.scrollView.frame.size.width
page = Int(floor((cell.scrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth * 2.0)))
pageControl.currentPage = page
let firstPage = page - 1
let lastPage = page + 1
for var index = 0; index < firstPage; ++index {
purgePage(index)
}
for index in firstPage...lastPage {
loadPage(index)
}
for var index = lastPage+1; index < sixPlusImages.count; ++index {
purgePage(index)
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
loadVisiblePages()
}
显然,它存在很多问题。我似乎无法访问单元格 class 中作为出口的 scrollView,这导致了一些问题。
谁能给我一些指导?我看不到任何 Swift 在线示例。
谢谢。
我注意到您正在使用 UIScrollView Tutorial: Getting Started 教程中建议的部分代码来使用 UIScrollView
.
制作幻灯片
您可以在自定义 UITableViewCell
中使用 UIScrollView
没有任何问题,首先您必须在 CustomTableViewCell
中声明您的 @IBOutlet
。
class CustomTableViewCell
必须实现协议 UIScrollViewDelegate
才能通知它有关 UIScrollView
的更改,您必须实现处理 UIScrollView
在里面。让我们看看下面的例子:
CustomTableViewCell to handle the UIScrollView
class CustomTableViewCell: UITableViewCell, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
var pageImages: [UIImage] = []
var pageViews: [UIImageView?] = []
override func awakeFromNib() {
super.awakeFromNib()
// 1
pageImages = [UIImage(named: "photo1.jpg")!,
UIImage(named: "photo2.jpg")!,
UIImage(named: "photo3.jpg")!]
let pageCount = pageImages.count
// 3
for _ in 0..<pageCount {
pageViews.append(nil)
}
// 4
let pagesScrollViewSize = scrollView.frame.size
scrollView.contentSize = CGSize(width: pagesScrollViewSize.width * CGFloat(pageImages.count),
height: pagesScrollViewSize.height)
// 5
loadVisiblePages()
}
func loadPage(page: Int) {
if page < 0 || page >= pageImages.count {
// If it's outside the range of what you have to display, then do nothing
return
}
// 1
if let pageView = pageViews[page] {
// Do nothing. The view is already loaded.
} else {
// 2
var frame = scrollView.bounds
frame.origin.x = frame.size.width * CGFloat(page)
frame.origin.y = 0.0
// 3
let newPageView = UIImageView(image: pageImages[page])
newPageView.contentMode = .ScaleAspectFit
newPageView.frame = frame
scrollView.addSubview(newPageView)
// 4
pageViews[page] = newPageView
}
}
func loadVisiblePages() {
// First, determine which page is currently visible
let pageWidth = scrollView.frame.size.width
let page = Int(floor((scrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth * 2.0)))
// Work out which pages you want to load
let firstPage = page - 1
let lastPage = page + 1
// Purge anything before the first page
for var index = 0; index < firstPage; ++index {
purgePage(index)
}
// Load pages in our range
for index in firstPage...lastPage {
loadPage(index)
}
// Purge anything after the last page
for var index = lastPage+1; index < pageImages.count; ++index {
purgePage(index)
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
// Load the pages that are now on screen
loadVisiblePages()
}
func purgePage(page: Int) {
if page < 0 || page >= pageImages.count {
// If it's outside the range of what you have to display, then do nothing
return
}
// Remove a page from the scroll view and reset the container array
if let pageView = pageViews[page] {
pageView.removeFromSuperview()
pageViews[page] = nil
}
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
那么在你的cellForRowAtIndexPath
中你的UITableViewController
或ViewController
中你唯一需要的就是下面的代码:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomTableViewCell
return cell
}
以上代码仅为示例,您必须考虑UIScrollView
的约束,启用Paging Enabled等
希望对你有所帮助。
我正在尝试将 UIScrollView()
添加到我的 table 的其中一个单元格中。我很难弄清楚用什么方法来放置滚动视图的代码。
我在我的应用程序的其他地方有一个滚动视图,这是我用来转移到我的 UITableView()
视图的代码,我猜它应该是:
var page = Int()
var pageViews: [UIImageView?] = []
var sixPlusImages = [
UIImage(named: "Glance 5.5"),
UIImage(named: "Currencies 5.5"),
UIImage(named: "Swipe 5.5"),
UIImage(named: "Format 5.5"),
UIImage(named: "Search 5.5")
]
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:AppImagesTableViewCell = self.appTableView.dequeueReusableCellWithIdentifier("appImages", forIndexPath: indexPath) as! AppImagesTableViewCell
return cell
}
func loadPage(page: Int) {
let cell = appTableView.cellForRowAtIndexPath(NSIndexPath(index: 0))
if page < 0 || page >= pageViews.count {
return
}
if let pageView = pageViews[page] {
return
} else {
var imageFrame = CGRect(x: (cell.scrollView.bounds.width * CGFloat(page)) + 5, y: 0, width: (cell.scrollView.bounds.width) - 10, height: 40)
let imageView = UIImageView()
imageView.contentMode = .ScaleAspectFit
imageView.frame = imageFrame
imageView.image = sixPlusImages[page]
cell.scrollView.addSubview(imageView)
}
pageViews[page] = imageView
}
func purgePage(page: Int) {
if page < 0 || page >= sixPlusImages.count {
return
}
if let pageView = pageViews[page] {
pageView.removeFromSuperview()
pageViews[page] = nil
}
}
func loadVisiblePages() {
let pageWidth = cell.scrollView.frame.size.width
page = Int(floor((cell.scrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth * 2.0)))
pageControl.currentPage = page
let firstPage = page - 1
let lastPage = page + 1
for var index = 0; index < firstPage; ++index {
purgePage(index)
}
for index in firstPage...lastPage {
loadPage(index)
}
for var index = lastPage+1; index < sixPlusImages.count; ++index {
purgePage(index)
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
loadVisiblePages()
}
显然,它存在很多问题。我似乎无法访问单元格 class 中作为出口的 scrollView,这导致了一些问题。
谁能给我一些指导?我看不到任何 Swift 在线示例。
谢谢。
我注意到您正在使用 UIScrollView Tutorial: Getting Started 教程中建议的部分代码来使用 UIScrollView
.
您可以在自定义 UITableViewCell
中使用 UIScrollView
没有任何问题,首先您必须在 CustomTableViewCell
中声明您的 @IBOutlet
。
class CustomTableViewCell
必须实现协议 UIScrollViewDelegate
才能通知它有关 UIScrollView
的更改,您必须实现处理 UIScrollView
在里面。让我们看看下面的例子:
CustomTableViewCell to handle the
UIScrollView
class CustomTableViewCell: UITableViewCell, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
var pageImages: [UIImage] = []
var pageViews: [UIImageView?] = []
override func awakeFromNib() {
super.awakeFromNib()
// 1
pageImages = [UIImage(named: "photo1.jpg")!,
UIImage(named: "photo2.jpg")!,
UIImage(named: "photo3.jpg")!]
let pageCount = pageImages.count
// 3
for _ in 0..<pageCount {
pageViews.append(nil)
}
// 4
let pagesScrollViewSize = scrollView.frame.size
scrollView.contentSize = CGSize(width: pagesScrollViewSize.width * CGFloat(pageImages.count),
height: pagesScrollViewSize.height)
// 5
loadVisiblePages()
}
func loadPage(page: Int) {
if page < 0 || page >= pageImages.count {
// If it's outside the range of what you have to display, then do nothing
return
}
// 1
if let pageView = pageViews[page] {
// Do nothing. The view is already loaded.
} else {
// 2
var frame = scrollView.bounds
frame.origin.x = frame.size.width * CGFloat(page)
frame.origin.y = 0.0
// 3
let newPageView = UIImageView(image: pageImages[page])
newPageView.contentMode = .ScaleAspectFit
newPageView.frame = frame
scrollView.addSubview(newPageView)
// 4
pageViews[page] = newPageView
}
}
func loadVisiblePages() {
// First, determine which page is currently visible
let pageWidth = scrollView.frame.size.width
let page = Int(floor((scrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth * 2.0)))
// Work out which pages you want to load
let firstPage = page - 1
let lastPage = page + 1
// Purge anything before the first page
for var index = 0; index < firstPage; ++index {
purgePage(index)
}
// Load pages in our range
for index in firstPage...lastPage {
loadPage(index)
}
// Purge anything after the last page
for var index = lastPage+1; index < pageImages.count; ++index {
purgePage(index)
}
}
func scrollViewDidScroll(scrollView: UIScrollView) {
// Load the pages that are now on screen
loadVisiblePages()
}
func purgePage(page: Int) {
if page < 0 || page >= pageImages.count {
// If it's outside the range of what you have to display, then do nothing
return
}
// Remove a page from the scroll view and reset the container array
if let pageView = pageViews[page] {
pageView.removeFromSuperview()
pageViews[page] = nil
}
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
那么在你的cellForRowAtIndexPath
中你的UITableViewController
或ViewController
中你唯一需要的就是下面的代码:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomTableViewCell
return cell
}
以上代码仅为示例,您必须考虑UIScrollView
的约束,启用Paging Enabled等
希望对你有所帮助。