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

时间:2015-03-09 22:31:29

标签: ios animation constraints

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

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

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

- (void)layoutSubviews
{
    [UIView performWithoutAnimation:^{
        [super layoutSubviews];
    }];
}

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

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

我仍然没有找到解决这个问题的答案。如何仅对某些内容设置约束动画,但在其子视图上防止出现奇怪的不需要的动画。

4 个答案:

答案 0 :(得分:12)

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

if [path] {
    elasticsearch {
        ...
    }
} else if [user_id2] {
    elasticsearch {
        ...
    }
} else {
    elasticsearch {
        ...
    }
}

答案 1 :(得分:0)

其他响应是正确的,但是您必须在所有视图层次结构上都这样做。添加此扩展方法,然后在不需要设置动画的**子视图**上调用它。

public func commitSuperviewsLayout() {
    var processedSuperview = superview

    while processedSuperview != nil {
        processedSuperview?.layoutIfNeeded()
        processedSuperview = processedSuperview?.superview
    }
}

答案 2 :(得分:0)

奇怪的是,如果您将 UIView.performWithoutAnimation 放在 UIView.animate 之前,它不起作用。如果你把它放在后面,它就起作用了!顺序很重要 :D

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    //        print("I am being edited")
    
    if self.searchCancelButton.isHidden {
        UIView.animate(withDuration: 0.2) {
            self.searchCancelButton.isHidden.toggle()
            self.topStack.layoutIfNeeded()
        }
    }
    
    UIView.performWithoutAnimation {
        self.state = .searchFoodView
        refreshEmptySearchFoodView()
    }
}

答案 3 :(得分:-1)

一般情况下,如果我只想为某些事物制作动画而不是其他事物,我会做的是确保所有不应设置动画的约束,并在调用之后

[view layoutIfNeeded]

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

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

[UIView animateWithDuration:0.2 animations:^{ [view layoutIfNeeded];}];