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.
Réponses
Trop de publicités?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];
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é.