动画约束时,防止子视图上出现不需要的动画

ise*_*sky 5 animation constraints ios

通常在动画UITableView的高度时,会在UITableViewCells上获得不需要的动画.重新使用的新单元格会在布局的子视图中出现并产生奇怪的不需要的动画.当表扩展时,这通常是可见的.

动画通常看起来像是从角落弹出的对象,因为它会因为某种原因将子视图的宽度和高度从0调整到它们应该的大小.

这可以通过覆盖单元格的layoutSubviews方法来解决.

- (void)layoutSubviews
{
    [UIView performWithoutAnimation:^{
        [super layoutSubviews];
    }];
}
Run Code Online (Sandbox Code Playgroud)

但这仍然无法阻止所包含的子视图执行不需要的动画.当您向单元格的contentView添加内容时,它也不会阻止不需要的动画.如果它也有子视图,你基本上必须覆盖你拥有的每个子视图的layoutSubviews方法.

这并不总是可行的,就像在contentView的情况下一样.我无法覆盖contentView类并告诉它在没有动画的情况下布局其子视图.这也是一个非常麻烦的修复,因为我需要将它添加到我能够覆盖的每个UIView对象.

我仍然没有找到解决这个问题的答案一劳永逸.如何在某些内容上制作约束动画,但在其子视图中防止出现奇怪的不需要的动画.

小智 12

我在UICollectionView中遇到了类似的问题,并且能够在其委托中修复它:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    // setup your cell
    // ...

    [UIView performWithoutAnimation:^{
        [cell layoutIfNeeded];
    }];

    return cell;
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*ans -1

一般来说,如果我只想为某些事物而不是其他事物设置动画,我要做的就是确保设置所有不应设置动画的约束,然后在调用之后

[view layoutIfNeeded]
Run Code Online (Sandbox Code Playgroud)

受这些约束影响的视图的父视图。

最后,我设置了我想要动画并调用的约束的常量

[UIView animateWithDuration:0.2 animations:^{ [view layoutIfNeeded];}];
Run Code Online (Sandbox Code Playgroud)

  • 但有时我只需要更改 tableView 的高度。我设置了一个限制。其余的动画超出了我的控制范围。 (2认同)