2015-04-08 2 views
18

Ich habe versucht, diese Frage für eine Weile zu finden, konnte aber nicht die Antwort dieses Problems finden. Mein Problem ist, dass ich eine UICollectionView und die Scroll-Richtung Horizontal mit Paging Enabled habe. Mein Problem ist, dass ich die Seite der aktuellen Seitennummer, auf der sich der Benutzer befindet, beibehalten möchte, also habe ich eine int Variable erstellt und möchte sie jedes Mal um 1 addieren oder subtrahieren, wenn der Benutzer nach rechts oder links wischt. Ich habe versucht, scrollView ‚s DelegiertenSeitenwechsel in UICollectionView erkennen

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

verwenden, aber wenn der Benutzer nach rechts oder links klaut, wird es so viele wie viele Male wie die Anzahl der Spalten auf einer Seite in der UICollectionView und es wird nicht lassen Sie mich genannt wissen, dass ob der Benutzer zur nächsten Seite oder zur vorherigen Seite gegangen ist.

Antwort

27

Verwendung:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    CGFloat pageWidth = collectionView.frame.size.width; 
    float currentPage = collectionView.contentOffset.x/pageWidth; 

    if (0.0f != fmodf(currentPage, 1.0f)) 
    { 
     pageControl.currentPage = currentPage + 1; 
    } 
    else 
    { 
     pageControl.currentPage = currentPage; 
    } 

    NSLog(@"Page Number : %ld", (long)pageControl.currentPage); 
} 

Und wenn Sie keine Pagecontrol verwenden, dann ceil(currentPage) Ihre aktuelle Seitenzahl sein.

+0

das funktioniert perfekt als Notwendigkeit, könnte nicht nur verstehen, die Bedingungen änderten sie so zu meinen eigenen, aber es gibt ein Problem, diese Methode wird nach den Delegierten von 'UICollectionView'' - (UICollectionViewCell *) colle aufgerufen ctionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath, aber meine Seitenzahlvariable ändert sich im Delegaten von 'ScrollView', so dass sie nicht wie benötigt funktioniert, irgendeine Lösung dazu? –

+0

Das ist ein normales Verhalten, diese Methode wird nur ausgelöst, wenn Ihr Collectionsview-Scrolling stoppt .. !! – itsji10dra

+0

yeah du hast Recht .. Ich werde versuchen, eine Alternative für meine Situation zu finden, aber für die Frage, das ist die perfekte Antwort. Danke für die Hilfe. –

8

u die aktuelle Seite wie unten zu bekommen, wird Index von 0 zu (total page - 1)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 
    NSLog(@"Current page -> %d",page); 
} 
+0

Danke einen Haufen .. :) gibt es eine Möglichkeit, dass diese Methode aufgerufen wird, bevor die 'UICollectionView'delegate '- (UICollectionViewCell *) collectionView: (UICollectionView *) collectionView cellForItemAtIndexPath: (NSIndexPath *) indexPath'? –

7

sein Basierend auf @Shankar BS ‚s Antwort, die ich es so in Swit implementiert haben. Beachten Sie, dass CollectionViewDelegate zu ScrollViewDelegate entspricht:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    let pageWidth = scrollView.frame.size.width 
    let page = Int(floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1) 
    print("page = \(page)") 
} 
3

Swift 2,2

func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    let x = collectionView.contentOffset.x 
    let w = collectionView.bounds.size.width 
    let currentPage = Int(ceil(x/w)) 
    print("Current Page: \(currentPage)") 
} 
+4

Sie sollten einen Kontext oder einen Kommentar hinzufügen, anstatt nur den Code als Antwort einzugeben. – NickyvV

12

** Swift 3 XCODE 8.2 **

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
     let x = scrollView.contentOffset.x 
     let w = scrollView.bounds.size.width 
     let currentPage = Int(ceil(x/w)) 
     // Do whatever with currentPage. 
} 
+0

Vielen Dank so sehr. :) – iPeter