使用 Swift 更新动画中的约束

Posted

技术标签:

【中文标题】使用 Swift 更新动画中的约束【英文标题】:Updating constraints in animation with Swift 【发布时间】:2015-06-04 08:13:19 【问题描述】:

我想要一个动画将 UIImageView 移动到由一组新约束定义的新位置,但由于某种原因,我无法让它工作。我正在尝试:

@IBOutlet weak var oldBottom: NSLayoutConstraint!

...

func animateMovement() 
     // Here I'm defining a new constraint
     var newBottom = NSLayoutConstraint(
        item: self.logo,
        attribute: NSLayoutAttribute.Bottom,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.usernameField,
        attribute: NSLayoutAttribute.Bottom,
        multiplier: 1,
        constant: 15)

     self.view.layoutIfNeeded()

    UIView.animateWithDuration(1.0, animations: 
        // Here I'm setting the already existing constraint (defined in storyboard) to the new constraint 
        self.oldBottom = newBottom
        self.view.layoutIfNeeded()
        
        , completion: )

【问题讨论】:

不要在动画块之外调用 layoutIfNeeded 【参考方案1】:

您需要更新约束并为 layoutIfNeeded 设置动画,试试这个:

func animateMovement() 
     var newBottom = NSLayoutConstraint(
        item: self.logo,
        attribute: NSLayoutAttribute.Bottom,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.usernameField,
        attribute: NSLayoutAttribute.Bottom,
        multiplier: 1,
        constant: 15)
     self.view.layoutIfNeeded()
     self.oldBottom = newBottom
     UIView.animateWithDuration(1.0, animations: 
         self.view.layoutIfNeeded()
     , completion: )

【讨论】:

我试过这样做,不幸的是它不起作用:-/ 约束是否在没有动画的情况下移动? 不,不是,但我发现了我的错误(请参阅问题中的更新):-)【参考方案2】:

所以我发现它的错误是一个非常简单的错误。我没有调用self.view.setTranslatesAutoresizingMaskIntoConstraints(false),因为我认为故事板已经处理了(因为我在其中使用了自动布局)。我只是在更新约束之前添加了它。 感谢所有输入:-)

【讨论】:

以上是关于使用 Swift 更新动画中的约束的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式更新约束的常量属性?

如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?

Swift:动画后将 UIView 的帧重置为其约束

iOS9.0中的动画锚样式约束

当使用动画块内函数的参数时,Swift 无法解析 UIView.animateWithDuration 中的 CurveEaseIn

设置 Lottie 动画的约束 - swift