У меня есть код, который нужно отложить для вызова reloadData
после завершения анимации прокрутки.
- При обновлении источника данных будет вызываться
performNextUpdate
. - Я буду
performNextUpdate
только если не воспроизводится анимация прокрутки. - После того, как я позвоню
reloadData
, затем я вызываю scrollToRowAtIndexPath
в последней ячейке для воспроизведения анимации прокрутки. - Я знаю, что
didEndScrollingAnimation
не сработает, если ячейка уже находится в положении, в котором она должна быть прокручена.Поэтому мне нужно проверить canScrollToBottomAtIndexPath
. - После завершения анимации прокрутки я снова позвоню
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);
}
}