快速使用自动布局时为 UIView 高度设置动画

Posted

技术标签:

【中文标题】快速使用自动布局时为 UIView 高度设置动画【英文标题】:Animate UIView height when using auto layout with swift 【发布时间】:2015-03-25 05:36:40 【问题描述】:

在自动布局之前,我一直在通过将框架设置在 animateWithDuration 上来为项目中的背景高度设置动画。

func setUpBackground() 
    self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 10)
    self.backgroundView.backgroundColor = UIColorFromRGB(0x2d2d2d).CGColor


func AnimateBackgroundHeight() 
    UIView.animateWithDuration(0.5, animations: 
        self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 600)    
    )

在我将项目转换为自动布局后,我注意到动画发生了,但之后背景高度又恢复为原始大小/样式(界面构建器设置)。我读到,当自动布局打开时,约束将用CGRect 覆盖设置UIView 尺寸。

因此我想知道如何在启用自动布局的情况下实现相同的高度变化动画效果。

【问题讨论】:

【参考方案1】:

给你的 backgroundView 一个高度限制,并为它创建一个 IBOutlet。在代码中,修改约束的常量值。

func AnimateBackgroundHeight() 
    UIView.animateWithDuration(0.5, animations: 
         self.heightCon.constant = 600 // heightCon is the IBOutlet to the constraint
         self.view.layoutIfNeeded()    
    )

【讨论】:

如何在视图动画期间获取高度?【参考方案2】:

对于那些发现这篇文章试图弄清楚为什么改变视图大小的转换会是块状或不干净的人,你只需要找到负责的视图并在UIView.animateWithDuration 块内调用self.view.layoutIfNeeded()。我一直在用头撞墙,尝试不同的限制条件并制作框架,直到意识到self.view.layoutIfNeeded() 将处理使过渡平滑,只要您将其放置在正确的位置。

【讨论】:

花了 7 个小时试图弄清楚为什么我的布局在制作动画时会中断。看到你的帖子后,我意识到我在子视图而不是父视图上调用 layoutIfNeeded。谢谢!!

以上是关于快速使用自动布局时为 UIView 高度设置动画的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局约束在 UIScrollView 内为 UIView 设置动画

在目标 c 中移动 UIView 时为其设置动画

拖动时为 UIView 设置动画

在 Swift 中,如何使用自动布局为 UIView 设置动画,就像页面滑入一样?

添加 UIView 并使用自动布局重新计算约束

自动布局中断 UIView 动画