在动画块中限制子视图的动画

问题描述 投票:0回答:1

为什么要限制动画子视图?为什么不在动画之后简单地进行布局更改?

考虑到我的视图层次结构和这个特定用例,这是合乎逻辑的,但不可行。

我的视图层次结构:

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非常感谢您提供提示或解决方案!

ios swift uicollectionview uianimation
1个回答
0
投票

感谢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

正是我想要的!

© www.soinside.com 2019 - 2024. All rights reserved.