在为UITableView设置动画时停止UITableViewCells动画

时间:2013-04-29 17:34:38

标签: ios uitableview autolayout uianimation

我正在为UITableView制作动画。我希望表格视图像这样滑开:

http://www.youtube.com/watch?v=XIGJLbiRsXE

但是,它会像这样打开:

http://www.youtube.com/watch?v=UJUX-ILCB_0

注意表格单元格本身是如何制作动画的。我怎样才能阻止这种情况发生?

我正在使用自动布局。因此代码是:

[theView addSubview:theTable];
[theTable reloadData];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];

其他细节,可能有关,也可能无关:

  • 表格视图的父级是一个scrollView

  • 我已覆盖表视图的intrinsicContentSize以返回表视图中所有单元格的高度,因此表格视图不会滚动

  • 我正在更改表格视图的数据源,然后再显示它

4 个答案:

答案 0 :(得分:12)

我遇到了类似的问题,并且能够使用UIView performWithoutAnimation:方法停止UITableViewCell上的动画。

使用tableView:willDisplayCell:forRowAtIndexPath: UITableViewDelegate方法在显示单元格之前获取对该单元格的引用。然后,在performWithoutAnimation:块中,在单元格对象上调用layoutIfNeeded,使其有机会布置其子视图:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [UIView performWithoutAnimation:^{
        [cell layoutIfNeeded];
    }];
}

答案 1 :(得分:2)

回答这个问题可能为时已晚,但这类情况下的问题通常在于动画块捕获下一个运行循环中安排的所有待处理布局。

我使用的解决方案是。我在动画之前调用layoutIfNeeded(在设置或使任何约束无效之前),然后在动画块中调用。

在你的情况下,它会是这样的,

[theView addSubview:theTable];
[theTable reloadData];
[theView layoutIfNeeded];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];

答案 2 :(得分:0)

您是否考虑过动画而不是位于表格视图上方的不透明子视图?

[theView addSubview:theTable];
[theTable reloadData];

UIView *subview = [[UIView alloc] initWithFrame:theTable.frame];
subview.backgroundColor = [UIColor whiteColor];
[theView addSubview:subview];

[UIView animateWithDuration:0.33 animations:^{
    subview.frame = CGRectMake(subview.frame.origin.x, subview.frame.size.height, subview.frame.size.width, 0.0);
}];

答案 3 :(得分:0)

在动画块中调用[theView layoutIfNeeded]之前,先尝试布置表格。理想情况下,您可以逐步布局,并且在0.33秒内您可以在桌面上获得滚动条,但目标是在动画块之外更改表格单元格布局。