2016-12-05 59 views
8

你好我有UICollectionView水平圖片列表代碼我想添加PageControl當滾動圖片將顯示,我添加了pagecontrol選擇器和IBOutlet,但是,我怎麼能整合它?在UICollecitonView之間。 ?如何在UICollectionView中添加PageControl圖片滾動

我的代碼如下。

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 


    @IBOutlet weak var View : DesignableView! 


    @IBOutlet var collectionView: UICollectionView! 
    @IBOutlet var collectionViewLayout: UICollectionViewFlowLayout! 

    @IBOutlet open weak var pageControl: UIPageControl? { 
     didSet { 
      pageControl?.addTarget(self, action: #selector(ViewController.pageChanged(_:)), for: .valueChanged) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     pageControl?.numberOfPages = 11 


    } 


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 11; 
    } 




    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell: ImageCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell 
     cell.label.text = "Cell \(indexPath.row)" 
     cell.backgroundImageView.image = UIImage(named: "Parallax \(indexPath.row + 1)") 

     // Parallax cell setup 
     cell.parallaxTheImageViewScrollOffset(self.collectionView.contentOffset, scrollDirection: self.collectionViewLayout.scrollDirection) 
     return cell 
    } 



    @IBAction open func pageChanged(_ sender: UIPageControl) { 

     print(sender.currentPage) 


    } 




    // MARK: Delegate 

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return collectionView.bounds.size; 
    } 

    // MARK: Scrolling 

    func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     // Parallax visible cells 
     for cell: ImageCollectionViewCell in collectionView.visibleCells as! [ImageCollectionViewCell] { 
      cell.parallaxTheImageViewScrollOffset(self.collectionView.contentOffset, scrollDirection: self.collectionViewLayout.scrollDirection) 
     } 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 

回答

22

在這裏你有一個完整的類,在頁面控制分頁水平集合視圖。 這是我的一個應用程序,現在工作,並正常工作。如果你不能工作,請隨時問我,我會幫你。

首先,在故事板,你必須設置你的CollectionView有:

佈局:流量
滾動方向:水平
滾動啓用
尋呼啓用

@IBOutlet weak var collectionView: UICollectionView! //img: 77 

@IBOutlet weak var pageControl: UIPageControl! 

var thisWidth:CGFloat = 0 

override func awakeFromNib() { 
    super.awakeFromNib() 

    thisWidth = CGFloat(self.frame.width) 
    collectionView.delegate = self 
    collectionView.dataSource = self 

    pageControl.hidesForSinglePage = true 

} 

func numberOfSections(in collectionView: UICollectionView) -> Int { 
    return 10 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 1 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCell", for: indexPath) 

    return cell 
} 

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
    self.pageControl.currentPage = indexPath.section 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    thisWidth = CGFloat(self.frame.width) 
    return CGSize(width: thisWidth, height: self.frame.height) 
} 
+0

哥們不與的PageControl工作時,我加入FUNC的CollectionView(_的CollectionView:UICollectionView,numberOfItemsInSection部的:int) - >內部{ 返回自.myarray.count //此處不工作頁面控制 } – SwiftDeveloper

+1

這是因爲,爲了使一個頁面的每個項目,你必須使用的部分,而不是行 –

+0

但這種解決方案,當用戶掃描到下一個頁面,然後無需擡起手指即可再次滑動,pageControl顯示錯誤的頁面。我認爲你應該考慮@盧克的回答 – gasparuff

22

我不是被接受的答案的粉絲。有時,willDisplay cell將根據用戶交互返回頁面控制的錯誤頁面。

我用什麼:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    pageControl.currentPage = Int(scrollView.contentOffset.x)/Int(scrollView.frame.width) 
} 

用戶已完成滾動從而使pageControlcurrentPage更準確後,這將更新頁面。

+0

這對於取代WillDisplayCell很有效。 –

3

等待scrollViewDidEndDecelerating,採用較慢的更新到UIPageControl。如果你想要一個更響應的用戶界面,我建議改爲執行scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)

夫特4示例,其中每個集合視圖部分是一個頁面:

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    if let collectionView = scrollView as? ScoreCollectionView, 
     let section = collectionView.indexPathForItem(at: targetContentOffset.pointee)?.section { 
     self.pageControl.currentPage = section 
    } 
} 
+1

這應該是唯一被接受的答案,因爲它是最乾淨和反應迅速的方法。 – Axy

+0

我必須將'section'替換爲'item' – pixelfreak

+1

如果您足夠快地滑動,當前頁面可能會產生錯誤的結果。 – pixelfreak

相關問題