为什么要限制动画子视图?为什么不在动画之后简单地进行布局更改?
考虑到我的视图层次结构和这个特定用例,这是合乎逻辑的,但不可行。
我的视图层次结构:
MyViewController:UIViewController
-> MyCustomView:UIView
-> MyCustomScrollView:UIScrollView, UIScrollViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource
为什么不可能?:
1)在各种约束更改之后,我在MyViewController中执行此操作:
UIView.animate(withDuration: 0.3, animations: {
self.view.layoutIfNeeded()
})
2)由于MyCustomView是一个包含MyCustomScrollView的子视图(依次包含一个UICollectionView作为其子视图),因此布局更新会触发CV的willDisplay
委托方法,在此方法下我要添加一堆准确地说是MyCustomView的标签。
这里是我正在调用的MyCustomView中的函数:
func addLabel(forIndexPath indexPath: IndexPath) {
var label: UILabel!
label.frame = Util.labelFrame(forIndex: indexPath, fillWidth: false) // The frame for the label is generated here!
//Will assign text and font to the label which are unnecessary to this context
self.anotherSubView.addSubview(label) //Add the label to MyCustomView's subview
}
3)因为这些变化从点1开始被捕获在动画块中,所以我发生了一些不必要的,不希望的动画。因此,MyCustomView的布局更改与此动画块绑定,迫使我寻找一种方法来阻止这种情况的发生
到目前为止尝试过的事情:
1]尝试将addSubView()
中的addLabel(forIndexPath:)
包裹在UIView.performWithoutAnimation {}
块中。 -没运气
2)尝试将addSubView()
中的addLabel(forIndexPath:)
包装到另一个动画块中,时间为0.0秒,以查看它是否覆盖了父动画块-不走运
3)探索了UIView.setAnimationsEnabled(enabled:)
,但看来这不会取消/暂停现有的动画师,并且会完全禁用所有动画如果为true(这不是我想要的)
总而言之,我的问题是:
我需要限制MyCustomView上的动画,但是我需要进行所有其他所需的布局更改。这有可能吗? TYIA非常感谢您提供提示或解决方案!
感谢this的答案,在添加标签后,从anotherSubview
的图层(在addLabel(forIndexPath:)
内)删除了所有动画:
self.anotherSubview.addSubview(label)
self.anotherSubview.layer.removeAllAnimations() //Doing this removes the animations queued to animate the label's frame into the view
正是我想要的!