我已经使用 Love 的多行选择示例实现了 Cocoa,其中涉及创建一个自定义 UITableViewCell,它在 layoutSubviews 中启动动画以在每行左侧显示复选框,如下所示:
- (void)layoutSubviews
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[super layoutSubviews];
if (((UITableView *)self.superview).isEditing)
{
CGRect contentFrame = self.contentView.frame;
contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
self.contentView.frame = contentFrame;
}
else
{
CGRect contentFrame = self.contentView.frame;
contentFrame.origin.x = 0;
self.contentView.frame = contentFrame;
}
[UIView commitAnimations];
}
这可以正常工作,并且出于所有意图和目的,我的 UITableView 都可以正常工作。但是我遇到了一个小的美学问题:当滚动我以前未显示的 UITableView 行时,它们会启动它们的滑动动画,这意味着当它们进入视图时,某些行的动画是交错的。
这是可以理解的,因为 setAnimationBeginsFromCurrentState 已设置为 YES 并且 UITableView 中更下方的行尚未更新其帧位置。为了解决这个问题,我尝试使用 willDisplayCell 覆盖在 UITableView 处于编辑模式时变为可见的单元格的动画。基本上绕过动画并立即更新行框架,以使其看起来好像单元格已经动画到位,如下所示:
/*
Since we animate the editing transitions, we need to ensure that all animations are cancelled
when a cell is scheduled to appear, so that things happen instantly.
*/
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cell.contentView.layer removeAllAnimations];
if(tableView.isEditing) {
CGRect contentFrame = cell.contentView.frame;
contentFrame.origin.x = EDITING_HORIZONTAL_OFFSET;
cell.contentView.frame = contentFrame;
} else {
CGRect contentFrame = cell.contentView.frame;
contentFrame.origin.x = 0;
cell.contentView.frame = contentFrame;
}
}
不幸的是,这似乎没有任何效果。有谁知道我如何解决这个问题?