2013-02-14 12 views
41

Ich verwende eine UICollectionView, um schnell durch eine Reihe von Miniaturansichten zu blättern. Wenn das Scrollen beendet ist, möchte ich eine größere hochauflösende Version der aktuellen Miniaturansicht anzeigen.UICollectionView: Wie erkennt man, wenn der Bildlauf gestoppt wurde

Wie kann ich erkennen, wenn der Benutzer das Scrollen abgeschlossen hat? Ich implementiere didEndDisplayingCell, aber das sagt mir nur, wenn eine bestimmte Zelle gescrollt hat; Es sagt mir nicht, wann die Scroll-Bewegung tatsächlich abgeschlossen ist.

Antwort

97
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView 

UICollectionView ist eine Unterklasse von UIScrollView. Wenn Sie also den Delegaten festgelegt und UIScrollViewDelegate implementiert haben, sollten Sie dies auf die gleiche Weise wie UIScrollView erkennen können.

Für zB: -

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

Wie pro documentation, das obige Verfahren sollte sagen, wenn die Scroll-Ansicht die Scroll-Bewegung beendet ist verlangsamt.

+6

Brilliant einen eigenen Delegierten machen. Du weißt nicht, wie viel böser Code mich gerettet hat. Ich habe versucht, es mithilfe des Callbacks shallInvalidateLayoutForBoundsChange in meinem UICollectionViewFlowLayout zu überwachen. Was für ein n00b. –

+0

Bitte beachten Sie D6mi Hinweis unten über scrollViewDidEndScrollingAnimation. scrollViewDidEndDecelerating wird nicht für das programmatische Scrollen aufgerufen. – RajV

+1

In der Tat, ich verstehe nicht, warum die aktuelle Antwort ist die akzeptierte, es funktioniert nicht 'scrollViewDidEndDecelerating' wird nicht aufgerufen, aber wie D6mi sagte, 'scrollViewDidEndScrollingAnimation' heißt – AkademiksQc

44

Nur um Ihre Grundlagen zu decken, sollten Sie diese beiden UIScrollViewDelegate-Methoden implementieren. In einigen Fällen gibt es möglicherweise keine Verzögerung (und scrollViewDidEndDecelerating würde nicht aufgerufen werden), z. B. wird die Seite vollständig an der Stelle gescrollt. In diesem Fall aktualisieren Sie direkt in scrollViewDidEndDragging.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) { 
    [self updateStuff]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self updateStuff]; 
} 
+6

Vielen Dank für das Teilen! Dies sollte die akzeptierte Antwort sein b/c OP gefragt "Scrolling hat aufgehört" - ohne beide Methoden kann der Benutzer leicht die Sammlungsansicht scrollen und Finger loslassen ohne zu blättern und 'scrollViewDidEndDecelerating' wird nicht aufgerufen,' scrollViewDidEndDragging' tut es . Danke, dass Sie diese Antwort geschrieben haben. –

21

Eine wichtige Tatsache, hier zu beachten:

Diese Methode auf Benutzer initiiert scrollt (dh eine Pan Geste)

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

Auf der anderen Seite aufgerufen wird, wird dieses auf alle aufgerufen manuell (programmgesteuert) initiiert Spiralen (wie "scrollRectToVisible" oder "scrollToItemAtIndexPath")

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
4

Swift 3-Version:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    // Your code here 
} 
+0

Vielen Dank! Es funktioniert gut. – Raja

0

wenn Sie den sichtbaren indexPath verwenden möchten:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self scrollingFinish]; 
} 
- (void)scrollingFinish { 


    if([self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader]){ 
     NSIndexPath *firstVisibleIndexPath = [[self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader] firstObject]; 
     [self.collectionView scrollToItemAtIndexPath:firstVisibleIndexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    } 
} 
1

Swift 3-Version von Abey M und D6mi ‚s Antworten:

Wenn Spirale durch den Benutzer verursacht

Aktion
public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if (!decelerate) { 
     //cause by user 
     print("SCROLL scrollViewDidEndDragging") 
    } 
} 

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    //caused by user 
    print("SCROLL scrollViewDidEndDecelerating") 
} 

Wenn blättern durch Code Aktion verursacht wird (programmatisch): (wie "scrollRectToVisible" oder „scrollt oItemAtIndexPath ")

public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { 
    //caused by code 
    print("SCROLL scrollViewDidEndScrollingAnimation") 
} 

Hinweise:

  • Setzen Sie diese Funktionen in Ihrem UIScrollViewDelegate oder UICollectionViewDelegate delegieren.
  • , wenn Sie nicht über einen separaten Delegierten haben, machen Sie Ihre aktuelle Klasse eine UIScrollViewDelegate op Spitze Ihrer Klassendatei

verlängern.

open class MyClass: NSObject , UICollectionViewDelegate 

und irgendwo in Ihrem viewWillAppear die Klasse

override open func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // ... 
    self.myScrollView.delegate = self 
    // ... 
} 
Verwandte Themen