关于 iOS 约束更新动画 - 动画块 + layoutIfNeeded

Posted

技术标签:

【中文标题】关于 iOS 约束更新动画 - 动画块 + layoutIfNeeded【英文标题】:About iOS Constraint update Animation - Animation block + layoutIfNeeded 【发布时间】:2018-07-31 01:28:08 【问题描述】:

您好,我正在尝试了解视图更新周期

我几乎可以理解一些东西,但有些东西很神秘

我了解到动画块也会在更新周期触发

为了尝试理解动画块中的layoutIfNeeded,我编写了一些示例代码,如下所示

class MyView: UIView 
    override func layoutSubviews() 
        super.layoutSubviews()
        print("Layout Subviews")
    

class ViewController: UIViewController 

    @IBOutlet weak var blueHeight: NSLayoutConstraint!

    @IBAction func heightPressed(_ sender: AnyObject) 

        if self.blueHeight.constant == 25.0 
            self.blueHeight.constant = self.view.bounds.height - 100.0
         else 
            self.blueHeight.constant = 25.0
        

        self.view.setNeedsLayout()
        UIView.animate(withDuration: 2.0, animations: 
            print("animation block")
            self.view.layoutIfNeeded() // ----- **
        )  (_) in
            print("animation ended")
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

输出是这样的

"Layout Subviews"
"Layout Subviews" ---- because of initial settings 
"Animation block"
"Layout Subviews"
"Animation ended"

但是当我将layoutIfNeeded 更改为setNeedsLayout 时,输出发生了变化

"Layout Subviews"
"Layout Subviews" ---- because of initial settings 
"Animation block"
"Animation ended"
"Layout Subviews"

所以我知道动画块首先执行并查看更新,所以动画块在更新周期中比视图的更新具有更高的优先级

对吗?如果我错了,我想了解视图的更新周期和动画块之间的关系

【问题讨论】:

"当我将 layoutIfNeeded 更改为 setNeedsLayout 时,输出发生了更改" 如果您将 layoutIfNeeded 更改为 setNeedsLayout,您不妨将其完全删除;这是同一件事。 layoutIfNeeded 表示一个动画——我们动画布局的行为。 setNeedsLayout 只是一个随机调用;这里没有动画。 感谢您的回复,但仍然感到困惑。 layoutIfNeeded 直接触发layoutSubviews(不要等到更新周期)。但是动画块在更新周期中被触发,并且动画块有layoutIfNeeded。我对这种关系感到困惑 【参考方案1】:

动画块内的内容,如果它是可动画的,直到事务结束时的动画时间才会运行。

layoutIfNeeded 算作动画。它在动画块中的作用是:它使在代码中或通过layoutSubviews 中的自动布局执行的帧等更改被动画化而不是立即进行。

基本上,这是将下一个布局时刻包装在动画中的一种方式。

【讨论】:

以上是关于关于 iOS 约束更新动画 - 动画块 + layoutIfNeeded的主要内容,如果未能解决你的问题,请参考以下文章

IOS 8 高度约束动画未按预期工作

以编程方式修改自动布局约束时视图不更新

iOS - 导航栏内的动画不起作用

Masonry 动画更新约束

Masonry整体动画更新约束

更新约束动画