使用Swift自动布局时如何为UIView高度添加动画效果

21

在使用自动布局之前,我曾通过在项目中设置帧并使用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尺寸的设置。

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

2个回答

51

为您的backgroundView添加高度约束,并创建一个IBOutlet。在代码中,修改约束的常量值。

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

如何在视图动画期间获取高度? - saurabhgoyal795

7

对于那些试图弄清楚为什么转换视图大小会变得粗糙或不干净的人,您只需要找到负责的视图并在UIView.animateWithDuration块内调用self.view.layoutIfNeeded()。我曾经尝试通过约束和框架来解决这个问题,但最终意识到只要将self.view.layoutIfNeeded()放置在正确的位置,就可以处理平滑过渡。


4
花了七个小时尝试弄清楚为什么我的布局在动画时会出问题。看了你的帖子后,我意识到我在子视图上调用了layoutIfNeeded而不是父视图。谢谢!! - JoakimE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接