it-swarm.com.de

UICollectionView: Wie erkennt man, wenn der Bildlauf angehalten wurde?

Ich verwende UICollectionView, um schnell durch eine Reihe von Miniaturansichten zu blättern. Sobald der Bildlauf beendet ist, möchte ich eine größere Version der aktuellen Miniaturansicht mit hoher Auflösung anzeigen. 

Wie kann ich erkennen, wenn der Benutzer den Bildlauf abgeschlossen hat? Ich implementiere didEndDisplayingCell, aber das sagt mir nur, wenn eine bestimmte Zelle abgescrollt wurde. es sagt mir nicht, wann die Bildlaufbewegung tatsächlich abgeschlossen ist.

51
George Armhold
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 dieselbe Weise wie UIScrollView erkennen können.

Zum Beispiel: - 

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

Wie in documentation beschrieben, sollte die obige Methode mitteilen, wann die Bildlaufansicht beendet ist und die Bildlaufbewegung verlangsamt hat.

112
iDev

Um Ihre Basen abzudecken, sollten Sie beide UIScrollViewDelegate-Methoden implementieren. In einigen Fällen kann es zu keiner Verzögerung kommen (und scrollViewDidEndDecelerating würde nicht aufgerufen), z. 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];
}
51
Abey M

Eine wichtige Tatsache, die hier zu beachten ist: 

Diese Methode wird bei vom Benutzer initiierten Bildlauf aufgerufen (d. H. Eine Schwenkbewegung).

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

Auf der anderen Seite wird dieser für alle manuell (programmgesteuert) eingeleiteten Scrolls (wie scrollRectToVisible oder scrollToItemAtIndexPath)

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
30
D6mi

Swift 3 Version:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // Your code here
}
8
Mr Stanev

Swift 3 Version von Abey M und D6mi Antworten:

Wenn der Bildlauf durch eine Benutzeraktion verursacht wird

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 der Bildlauf durch eine Code-Aktion (programmgesteuert) verursacht wird: (wie "scrollRectToVisible" oder "scrollToItemAtIndexPath")

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

Anmerkungen:

  • Fügen Sie diese Funktionen in Ihren UIScrollViewDelegate- oder UICollectionViewDelegate-Delegaten ein.
  • wenn Sie keinen separaten Delegaten haben, erweitern Sie Ihre aktuelle Klasse um ein UIScrollViewDelegate -Optop Ihrer Klassendatei

.

open class MyClass: NSObject , UICollectionViewDelegate

und irgendwo in Ihrem viewWillAppear machen Sie die Klasse zu einem eigenen Delegaten

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

wenn Sie den sichtbaren Indexpfad 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];
    }
}
0
Ofir Malachi