web-dev-qa-db-fra.com

comment vérifier quand UITableView a terminé le défilement

Existe-t-il un moyen de vérifier si ma tableview vient juste de terminer le défilement? table.isDragging et table.isDecelerating sont les deux seules méthodes que je puisse trouver. Je ne sais pas comment je peux anticiper ou recevoir une notification lorsque la vue de la table a fini de défiler.

Puis-je en quelque sorte utiliser des minuteries pour vérifier chaque seconde si la tableView défile ou non?

17
sankaet

Vous implémenteriez la méthode de protocole UIScrollViewDelegate comme suit:

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

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

- (void)scrollingFinish {
    //enter code here
}

Version rapide

public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if decelerate {
        scrollingFinished()
    }
}

public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    scrollingFinished()
}

func scrollingFinished() {
    print("scrolling finished...")
}

Pour la méthode déléguée ci-dessus The scroll view sends this message when the user’s finger touches up after dragging content. The decelerating property of UIScrollView controls deceleration. Lorsque la vue est décélérée pour s'arrêter, le paramètre decelerate sera NO.

Le second utilisé pour le défilement lent, même le défilement s’arrête lorsque vous touchez votre doigt, comme le dit Apple Documents, when the scrolling movement comes to a halt.

35
shanegao

Le code ci-dessous vous mettra à jour à chaque fois que le défilement de l'utilisateur est arrêté.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate)
    {
        if (isScrollingStart)
        {
            isScrollingStart=NO;
            [self scrollingStopped];
        }
    }
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{

    if (isScrollingStart)
    {
        isScrollingStart=NO;
        [self scrollingStopped];
    }
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    isScrollingStart=YES;
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    isScrollingStart=YES;
}
-(void)scrollingStopped
{
    NSLog(@"Scrolling stopped");
}
5
Pandey_Laxman

UITableView est conforme à UIScrollViewDelegate. Veuillez vous reporter à la documentation de ce protocole, il contient les méthodes dont vous avez besoin.

1
Jeepston

Après avoir utilisé la réponse de shanegao et le commentaire de Jovan Stankovic, j’ai conçu cela pour Swift3 -

extension NMViewController: UIScrollViewDelegate {
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if !decelerate {
            scrollViewDidEndDecelerating(scrollView)
        }
    }

    func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
        scrollViewDidEndDecelerating(scrollView)
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // Your logic to handle after scrolling is done
    }
}
0
Nikhil Manapure