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

Posted

技术标签:

【中文标题】iOS9.0中的动画锚样式约束【英文标题】:Animate anchor style constraints in iOS9.0 【发布时间】:2015-09-26 21:28:22 【问题描述】:

使用锚样式NSLayoutConstraints(如在此答案中:Swift | Adding constraints programmatically)如何为子视图设置动画?

对于那些懒惰的人,这里是代码:

override func viewDidLoad() 
    super.viewDidLoad()

    let newView = UIView()
    newView.backgroundColor = UIColor.redColor()
    newView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(newView)

    let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
    let vertivalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
    let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
    let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
    NSLayoutConstraint.activateConstraints([horizontalConstraint, vertivalConstraint, widthConstraint, heightConstraint])

具体来说,如果我想向右滑动newView,我该怎么做?谢谢。

【问题讨论】:

【参考方案1】:

您需要设置约束,然后在动画块中使用 layoutIfNeeded 进行更新:

self.horizontalConstraint.constant += 10 // move right 10 px.
UIView.animateWithDuration(0.5) 
    self.view.layoutIfNeeded()

【讨论】:

所以我必须先将约束分配给全局变量?我关心的是NSLayoutConstraint.activateConstraints——如果我改变了一个锚约束,我不需要再次调用NSLayoutConstraint.activateConstraints来激活它吗?另外,如果我想将锚点更改为另一个 UIView 怎么办? No.. Horizo​​ntalConstraint 是你设置的约束。它有一个名为constant 的属性,如果你添加它,你的视图会向右移动。您设置它的方式,常量默认为 0。正数在中心右侧,负数在中心左侧。不确定你从哪里得到全局变量。 我正在使用centerXAnchorcenterYAnchor,请阅读上面的代码。我想做的是改变锚点。 您询问了如何为视图设置动画。我向您展示了如何修改约束并为其设置动画 - 苹果推荐的使用约束为视图设置动画的方法。首先,更新约束,然后在动画块内的父视图上调用layoutIfNeeded。如果您尝试做其他事情,请更新您的问题。在您的代码示例中,您对newView 有一个水平约束。如果您添加到它,您将推送newView 正确。使用我在答案中显示的动画块对其进行动画处理。 您不能直接更改锚点。锚点是一个只读属性,仅有助于布局。这就是你更新约束的constant 属性的原因。

以上是关于iOS9.0中的动画锚样式约束的主要内容,如果未能解决你的问题,请参考以下文章

使用约束对动态生成的视图进行动画处理

Recycler View 中的约束设置动画未正确设置动画

使用jQuery简化动画锚点导航

-(void)updateConstraints 中的动画约束更改

具有锚样式自动布局约束的 UIButtons 未显示

使用 Swift 更新动画中的约束