动画之约束动画
基于约束的动画。就是修改NSLayoutConstraint的动画。
- 约束的查找
- 实现动画
- 约束生效的方式
- Anchor约束
约束的查找
要修改View的约束,首先得找到原定义的约束吧。或者修改原约束的定义,或者废除原约束添加新的约束。但不管怎样,首先咱们得找到原约束!
相信大家对自动布局很熟悉了,在代码中修改约束也比较常见。但一般都使用IBOutlet的方式获取的特写约束。但如果要获取大量的约束呢,咱们不可以每一个约束都链接上IBOutlet的属性吧。下面介绍两种方式去获取特写的约束:
约束遍历的方式
对于一个View与其父View(或兄弟之间的约束),通过对其父View的约束进行遍历,通过约束的属性进行查找:
titleLabel.superview?.constraints.forEach { constraint in
if constraint.firstItem === titleLabel &&
constraint.firstAttribute == .centerX {
constraint.constant = 50.0
return
}
}
这种方式有两个缺点:1.如果titleLabel不是firstItem,而是secondItem呢?那判断条件还得去判断一次; 2.如果firstItem有很多兄弟节点,有很多关于它的约束,那查找起特写的约束会相当麻烦。
为约束设置identifier的方式
为将要修改的约束设置一个identifier,那查找起来就方便多了。直接通过判断identifier去实现查找。
titleLabel.superview?.constraints.forEach { constraint in
if constraint.identifier == "TitleCenterY" {
constraint.isActive = false
continue
}
}
实现动画
当你修改了约束以后,通过调用view.layoutIfNeeded()去刷新页面,让约束生效。所以实现约束动画的方式就是将view.layoutIfNeeded()放到View动画的动画部分:
UIView.animate(withDuration: 1.0, delay: 0.0,
options: .curveEaseIn,
animations: {
view.layoutIfNeeded()
},completion: nil
)
约束生效的方式
以前写约束总是通过创建约束,然后通过View.addConstraints的方式让约束生效。让约束生效的另一种方式就是,调用约束的active方法
constraint.isActive = true
//另一种方法
headerview.addConstraints([constraint01,constraint02,constraint03])
Anchor约束
iOS9.0以后的一个类NSLayoutAnchor。它能让我们创建约束更加直观,方便。
@available(iOS 9.0, *)
open var centerXAnchor: NSLayoutXAxisAnchor { get }
//下面是一个例子
let conX = detailView.centerXAnchor.constraint(equalTo:
headerview.centerXAnchor)