【问题标题】:UIScrollView in UITableViewCell in SwiftSwift 中 UITableViewCell 中的 UIScrollView
【发布时间】:2015-04-20 15:33:07
【问题描述】:

我正在尝试将UIScrollView() 添加到我表格的一个单元格中。我很难弄清楚将代码放入滚动视图的方法。

我的应用程序的其他地方有一个滚动视图,这是我用来转移到我的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()
}

显然,它存在很多问题。我似乎无法访问我在单元类中作为插座的 scrollView,这会导致一些问题。

谁能给我一些指导?我看不到任何在线 Swift 示例。

谢谢。

【问题讨论】:

    标签: ios uitableview swift uiscrollview uiimage


    【解决方案1】:

    我注意到您正在使用 UIScrollView Tutorial: Getting Started 教程中建议的部分代码来使用 UIScrollView 制作幻灯片。

    您可以在自定义UITableViewCell 中使用UIScrollView 没有任何问题,首先您必须在CustomTableViewCell 中声明您的@IBOutlet

    CustomTableViewCell 类必须实现协议UIScrollViewDelegate 才能被通知UIScrollView 的变化,您必须实现处理其中的UIScrollView 的函数。让我们看看下面的例子:

    CustomTableViewCell 来处理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 中的UITableViewControllerViewController 中,您唯一需要的是以下代码:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomTableViewCell        
    
        return cell
    }
    

    上面的代码只是举例,你必须考虑UIScrollView的约束,启用Paging Enabled等。

    希望对你有所帮助。

    【讨论】:

    • 谢谢!我尝试了该代码(显然首先将变量更改为我自己的),它编译,但表中没有显示任何内容。只是一个空单元格。
    • 如果你愿意,我可以通过 github 分享项目
    • 你的图片是不是自己设置的?
    • 是的,我的图像设置正确。我现在正在检查代码,看看是否能发现任何差异。
    • 另外,滚动视图不只是水平滚动,还可以向任何方向拖动?我不知道为什么,因为我拥有的另一个滚动视图没有这样做。我将针对我当前的问题发布一个单独的问题。
    猜你喜欢
    • 2015-09-02
    • 2014-02-22
    • 1970-01-01
    • 2013-03-29
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多