Answers:
那这个呢?
[CATransaction begin];
[CATransaction setCompletionBlock:^{
// animation has finished
}];
[tableView beginUpdates];
// do some work
[tableView endUpdates];
[CATransaction commit];
这是可行的,因为tableView CALayer
动画在内部使用动画。也就是说,他们将动画添加到任何open中CATransaction
。如果不CATransaction
存在打开(正常情况),则隐式开始,然后在当前运行循环的末尾结束。但是,如果您自己开始,就像在这里做的那样,那么它将使用那个。
completionBlock
before” beginUpdates
和“ endUpdates
like”?
[CATransaction commit]
应该在之后之前调用[tableView endUpdates]
。
一种可能的解决方案是从您调用的UITableView继承endUpdates
并覆盖它setContentSizeMethod
,因为UITableView会调整其内容大小以匹配添加或删除的行。这种方法也应该适用reloadData
。
为了确保仅在endUpdates
调用后发送通知,也可以覆盖endUpdates
并在其中设置标志。
// somewhere in header
@private BOOL endUpdatesWasCalled_;
-------------------
// in implementation file
- (void)endUpdates {
[super endUpdates];
endUpdatesWasCalled_ = YES;
}
- (void)setContentSize:(CGSize)contentSize {
[super setContentSize:contentSize];
if (endUpdatesWasCalled_) {
[self notifyEndUpdatesFinished];
endUpdatesWasCalled_ = NO;
}
}
您可以将操作封装在UIView动画块中,如下所示:
- (void)tableView:(UITableView *)tableView performOperation:(void(^)())operation completion:(void(^)(BOOL finished))completion
{
[UIView animateWithDuration:0.0 animations:^{
[tableView beginUpdates];
if (operation)
operation();
[tableView endUpdates];
} completion:^(BOOL finished) {
if (completion)
completion(finished);
}];
}
endUpdates
之前但在动画完成之前调用完成块。
尚未找到一个好的解决方案(缺少对UITableView的子类化)。我决定暂时使用performSelector:withObject:afterDelay:
。不理想,但是可以完成工作。
更新:看来我可以scrollViewDidEndScrollingAnimation:
用于此目的(这是特定于我的实现的,请参阅注释)。
scrollViewDidEndScrollingAnimation
只叫响应setContentOffset
和scrollRectToVisible
您可以这样使用tableView:willDisplayCell:forRowAtIndexPath:
:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"tableView willDisplay Cell");
cell.backgroundColor = [UIColor colorWithWhite:((indexPath.row % 2) ? 0.25 : 0) alpha:0.70];
}
但是,当表中已有的单元格从屏幕外移动到屏幕上时,也会调用此方法,因此它可能并不是您所要查找的。我只是查看了所有UITableView
and UIScrollView
委托方法,插入单元格动画后似乎没有什么要处理的。
为什么在动画结束后动画结束时不只是调用要调用的方法endUpdates
?
- (void)setDownloadedImage:(NSMutableDictionary *)d {
NSIndexPath *indexPath = (NSIndexPath *)[d objectForKey:@"IndexPath"];
[indexPathDelayed addObject:indexPath];
if (!([table isDragging] || [table isDecelerating])) {
[table beginUpdates];
[table insertRowsAtIndexPaths:indexPathDelayed withRowAnimation:UITableViewRowAnimationFade];
[table endUpdates];
// --> Call Method Here <--
loadingView.hidden = YES;
[indexPathDelayed removeAllObjects];
}
}
willDisplayCell
不会起作用。我需要它在动画之后发生,因为我只需要在一切解决后进行视觉更新即可。
-scrollToRowAtIndexPath:atScrollPosition:animated:
。