无法在动画块中限制子视图的动画
Trouble restraining subview's animation within an animation block
为什么要限制子视图的动画效果?为什么不简单地在动画之后进行布局更改呢?
考虑到我的视图层次结构和这个特定用例,这是合乎逻辑但不可行的。
我的视图层次结构:
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) 尝试将 addLabel(forIndexPath:)
中的 addSubView()
包裹在 UIView.performWithoutAnimation {}
块中。 - 运气不好
2) 尝试用 0.0 秒的时间将 addLabel(forIndexPath:)
中的 addSubView()
包裹在另一个动画块中,看看这是否会覆盖父动画块 - 运气不好
3) 探索了 UIView.setAnimationsEnabled(enabled:)
但似乎这不会 cancel/pause 现有的动画师,并且将完全禁用 所有动画 如果 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
完全符合我的要求!
为什么要限制子视图的动画效果?为什么不简单地在动画之后进行布局更改呢?
考虑到我的视图层次结构和这个特定用例,这是合乎逻辑但不可行的。
我的视图层次结构:
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) 尝试将 addLabel(forIndexPath:)
中的 addSubView()
包裹在 UIView.performWithoutAnimation {}
块中。 - 运气不好
2) 尝试用 0.0 秒的时间将 addLabel(forIndexPath:)
中的 addSubView()
包裹在另一个动画块中,看看这是否会覆盖父动画块 - 运气不好
3) 探索了 UIView.setAnimationsEnabled(enabled:)
但似乎这不会 cancel/pause 现有的动画师,并且将完全禁用 所有动画 如果 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
完全符合我的要求!