2016-12-05 2 views
8

Hallo Ich habe UICollectionView horizontale Bild Auflistungen Ich möchte PageControl hinzufügen, wenn Bilder scrollen, zeigt ich pagecontrol Selektor und IBOutlet, aber, wie kann ich es integrieren? zwischen UICollecitonView. ?So fügen Sie PageControl in UICollectionView Image Scrolling

Meine Codes unten.

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. 
    } 



} 

Antwort

22

Hier haben Sie eine vollständige Klasse mit Seitenkontrolle in einer horizontalen Sammlungsansicht. Dies funktioniert gerade an einer meiner Anwendungen und funktioniert ordnungsgemäß. Wenn Sie es nicht schaffen, zögern Sie nicht, mich zu fragen, und ich werde Ihnen helfen.

Zuerst wird in der Storyboard müssen Sie Ihre Collection mit ein:

Layout-: Strömungs
Scroll-Richtung: Horizontal
Scrolling
Paging aktiviert

aktiviert
@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

Geck arbeiten nicht mit Pagecontrol, wenn ich func Collection hinzugefügt (_ Collection: UICollectionView, numberOfItemsInSection Abschnitt: Int) -> Int { return self .myarray.count // HIER funktioniert nicht page control } – SwiftDeveloper

+1

Das ist, weil, um eine Seite für jedes Element zu erstellen, müssen Sie Abschnitte, nicht Zeilen verwenden –

+0

Aber mit dieser Lösung, wenn der Benutzer auf die nächste Seite und dann wischt Wischen Sie zurück, ohne den Finger zu heben, das PageControl zeigt die falsche Seite an. Ich denke, Sie sollten @ Lukes Antwort in Betracht ziehen – gasparuff

22

Ich bin kein Fan der angenommenen Antwort. Von Zeit zu Zeit gibt willDisplay cell je nach Benutzerinteraktion die falsche Seite für die Seitensteuerung zurück.

Was ich benutze:

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

Dies wird die Seite aktualisiert werden, nachdem der Benutzer somit beendet hat Scrolling machen die currentPage des pageControl genauer.

+0

Dies funktionierte großartig für den Ersatz WillDisplayCell .. –

3

Warten auf scrollViewDidEndDecelerating führt zu einer langsamen Aktualisierung der UIPageControl. Wenn Sie eine reaktionsfähigere Benutzeroberfläche wünschen, empfehle ich stattdessen die Implementierung scrollViewWillEndDragging(_:withVelocity:targetContentOffset:).

Swift 4 Beispiel, in dem jede Sammlung Ansicht Abschnitt ist eine Seite:

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

Dies sollte die einzige akzeptierte Antwort sein, da es die sauberste und ansprechende Art ist, es zu tun. – Axy

+0

Ich muss "Abschnitt" für "Artikel" ersetzen – pixelfreak

+1

Wenn Sie schnell genug wischen, kann die aktuelle Seite das falsche Ergebnis liefern. – pixelfreak

Verwandte Themen