UITableView scrollToRowAtIndexPath не запускает scrollViewDidEndScrollingAnimation - PullRequest
0 голосов
/ 01 октября 2018

У меня есть код, который нужно отложить для вызова reloadData после завершения анимации прокрутки.

  1. При обновлении источника данных будет вызываться performNextUpdate.
  2. Я буду performNextUpdate только если не воспроизводится анимация прокрутки.
  3. После того, как я позвонюreloadData, затем я вызываю scrollToRowAtIndexPath в последней ячейке для воспроизведения анимации прокрутки.
  4. Я знаю, что didEndScrollingAnimation не сработает, если ячейка уже находится в положении, в котором она должна быть прокручена.Поэтому мне нужно проверить canScrollToBottomAtIndexPath.
  5. После завершения анимации прокрутки я снова позвоню performNextUpdate с pendingDataSource (если существует).

Моя проблема в том,редко scrollViewDidEndScrollingAnimation не срабатывает.Так что animateScrolling = YES навсегда.Даже если есть pendingDataSource, приложение больше не будет reloadData.

Кто-нибудь знает, что может вызвать scrollViewDidEndScrollingAnimation не срабатывает при вызове scrollToRowAtIndexPath:?


Вот мойпример кода,

- (void)performNextUpdate {
    if (self.pendingDataSource && !self.animateScrolling) {
        self.dataSource = self.pendingDataSource;
        [self.tableView reloadData];
        [self animateScrollToBottomIfNeeded];
    }
}

- (void)animateScrollToBottomIfNeeded {
    if ([self canScrollToBottomAtIndexPath:indexPath]) {
        self.animateScrolling = YES;
        [self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
        // Wait for didEndScrollingAnimation to call before performing the next update
    } else {
        // Can perform the next update immediately, since there's no need to scroll.
        self.animateScrolling = NO;
        [self performNextUpdate];
    }
}

// Sometimes this function is not triggered. ?
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    self.animateScrolling = NO;
    [self performNextUpdate];
}

- (BOOL)canScrollToBottomAtIndexPath:(NSIndexPath *)indexPath {
    if (!indexPath) {
        return NO;
    }
    if ((self.tableView.tracking || self.tableView.dragging) && !self.tableView.isDecelerating) {
        return NO;
    }
    CGRect viewPort = CGRectMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y, self.tableView.bounds.size.width, self.tableView.bounds.size.height);
    CGRect visibleViewPort = UIEdgeInsetsInsetRect(viewPort, self.tableView.contentInset);
    CGRect cellRect = [self.tableView rectForRowAtIndexPath:indexPath];
    if (CGRectEqualToRect(cellRect, CGRectZero)) {
        // If indexPath is invalid, it will return CGRectZero.
        return NO;
    } else {
        return !CGRectContainsRect(visibleViewPort, cellRect);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...