188 votes

Dites à UIScrollView de faire défiler vers le haut

Comment puis-je dire à UIScrollView de faire défiler vers le haut à tout moment? Je crois que scrollView.scrollsToTop = YES; permet simplement à l'utilisateur d'appuyer sur la barre d'état pour faire défiler vers le haut. Que devrais-je faire? Merci de votre aide.

330voto

rob mayoff Points 124153

MISE À JOUR POUR iOS 7

 [self.scrollView setContentOffset:
    CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
 

ORIGINAL

 [self.scrollView setContentOffset:CGPointZero animated:YES];
 

ou si vous voulez conserver la position de défilement horizontal et simplement réinitialiser la position verticale:

 [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
    animated:YES];
 

23voto

Bryan Chen Points 14689

Utilisez setContentOffset:animated:

 [scrollView setContentOffset:CGPointZero animated:YES];
 

8voto

plaidbear Points 45

Dans iOS7, j'avais du mal à faire passer une vue de défilement particulière au sommet, ce qui fonctionnait sous iOS6, et je l'utilisais pour définir la vue de défilement à atteindre.

 [self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
 

2voto

Ortwin Gentz Points 15102

De parfaitement reproduire la barre d'état scrollToTop comportement non seulement nous avons à définir la contentOffset mais aussi assurez-vous que le scrollIndicators sont affichés. Sinon, l'utilisateur peut rapidement se perdre.

La seule méthode publique pour accomplir cela est - flashScrollIndicators. Malheureusement, en l'appelant une fois après la mise à l'contentOffset a pas d'effet, car c'est de réinitialiser immédiatement. J'ai trouvé ça fonctionne quand on fait le flash à chaque fois, en scrollViewDidScroll:.

// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291

- (void)scrollContentToTop {
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];

    self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.scrollView.tag = 0;
    });
}

Dans votre UIScrollViewDelegate (ou UITable/UICollectionViewDelegate) de mettre en œuvre ce:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
        [scrollView flashScrollIndicators];
    }
}

Le délai de masquage est un peu courte par rapport à la barre d'état scrollToTop comportement, mais il a toujours l'air agréable.

Note que je suis d'abuser de la vue de la balise de communiquer le "isScrollingToTop" l'état parce que j'ai besoin de cette vue à travers les contrôleurs. Si vous êtes à l'aide de balises pour quelque chose d'autre, vous pourriez voulez la remplacer par une iVar ou une propriété.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X