所以我正在学习如何从屏幕外制作视图动画,以用作滑块菜单。
class ViewController: UIViewController {
@IBOutlet weak var red: UIView!
@IBOutlet weak var redHConstraint: NSLayoutConstraint!
@IBAction func buttonShift(sender: AnyObject) {
self.view.layoutIfNeeded() // **HERE**
UIView.animateWithDuration(0.5) {
self.redHConstraint.constant = 0
self.view.layoutIfNeeded() // And **HERE**
}
}
}
我已经从How to animate a UIView with constraints in Swift?
改编了这段代码 1。 self.view.layoutIfNeeded()
部分代码的作用是什么?
2。为什么在动画之前和期间编码2x?
注意:如果我评论出第一个self.view.layoutIfNeeded()
没有任何变化,但如果我评论出第二个self.view.layoutIfNeeded()
,则该动作不再是动画,只会出现在新坐标中。
答案 0 :(得分:26)
基本上调用self.view.layoutIfNeeded()
会强制self.view
及其子视图的布局,如果setNeedsLayout
的某些更改集self.view
。
setNeedsLayout
用于设置一个标记,无论何时调用layoutIfNeeded()
,都会调用layoutSubviews
。它决定了呼叫的“如果需要”方面。
如果您对UIView进行了更改,导致其setNeedsLayout
但未调用layoutIfNeeded()
(因此未调用layoutSubviews),则不会更新,因此可能会导致动画出现问题。如果您事先调用它,它将确保如果有更改需要更新布局,那么它将在动画制作之前将其应用于您的视图及其所有子视图。
当然,动画制作动画时需要更新。