在 ViewController 上的 CollectionViewCell 中使用 PageControl

Posted

技术标签:

【中文标题】在 ViewController 上的 CollectionViewCell 中使用 PageControl【英文标题】:Using PageControl in a CollectionViewCell on a ViewController 【发布时间】:2017-05-29 11:54:20 【问题描述】:

我正在尝试为 CollectionViewCell 中的图像显示 PageControl。

一切似乎都正常工作——页数正确,甚至 print(currentPage) 显示正确的索引;但是,PageControl 没有显示正确的当前页面。

EncounterDetailViewController.swift

class EncounterDetailViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIScrollViewDelegate 

// MARK: - Properties
var selectedEncounter: Encounter?
var currentPage = 0

// MARK: - UICollectionViewDataSource
func numberOfSections(in collectionView: UICollectionView) -> Int 
    return 1


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return (selectedEncounter?.images.count)!


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imageCell", for: indexPath) as! EncounterCollectionViewCell

    cell.imageView.sd_setImage(with: URL(string: (selectedEncounter?.images[indexPath.row])!))
    cell.pageControl.numberOfPages = (selectedEncounter?.images.count)!
    cell.pageControl.currentPage = self.currentPage

    return cell


// MARK: - ScrollView Delegate Method
func scrollViewDidScroll(_ scrollView: UIScrollView) 
    let pageWidth = scrollView.frame.width
    self.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
    print(currentPage)



EncounterCollectionViewCell.swift

class EncounterCollectionViewCell: UICollectionViewCell 

    // MARK: - Outlets
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var pageControl: UIPageControl!


【问题讨论】:

pageControl 显示哪个页面? 您有一个pageControl,但您正在根据collectionView contentOffset 计算currentPage。为什么? 我正在尝试根据每个水平滚动更改 pageControls currentPage。 你的单元格中有scrollView吗? 我相信是这样 - 集合视图单元格水平滚动。我可以通过将页面控件连接到 ViewController 来解决这个问题。 【参考方案1】:

不确定这是否是最佳实践方式,但我将 pageControl 连接到 EncounterDetailViewController 而不是单元格内。

class EncounterDetailViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIScrollViewDelegate 

    @IBOutlet weak var pageControl: UIPageControl!

    // MARK: - Properties
    var currentPage = 0

    // MARK: - View did load
    override func viewDidLoad() 
        super.viewDidLoad()

        self.pageControl.numberOfPages = (selectedEncounter?.images.count)!

    

    // MARK: - ScrollView Delegate Method
func scrollViewDidScroll(_ scrollView: UIScrollView) 
    let pageWidth = scrollView.frame.width
    self.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
    self.pageControl.currentPage = self.currentPage


【讨论】:

以上是关于在 ViewController 上的 CollectionViewCell 中使用 PageControl的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tabbar 上的 Single viewController 中使用两个 tableView

在 viewDidLoad 之前调用 ViewController 上的自定义 init 方法

CollectionView 与单元格重叠

当 UIView 上的按钮被按下时,ViewController 中的标签会动态变化

如何从 viewController2 上的按钮对 viewController1 执行操作?

将 navigationController 上的 viewController 推送到动画底部到顶部 iPhone SDK