所以我有一个容器视图(停靠在屏幕边缘)和一个子视图,它应该滑入和滑出它。
func slideOut() {
UIView.animateWithDuration(Double(0.5), animations: {
self.container.bottomAnchor
.constraintEqualToAnchor(self.child.bottomAnchor).active = false
self.view.layoutIfNeeded()
})
}
func slideIn() {
UIView.animateWithDuration(Double(0.5), animations: {
self.container.bottomAnchor
.constraintEqualToAnchor(self.child.bottomAnchor).active = true
self.view.layoutIfNeeded()
})
print("numConstraints: \(container.constraints.count)")
}
slideIn()
动画很好,就像它应该的那样。问题是我不知道如何做slideOut()
动画。如果我只是停用上面的NSLayoutConstraint
,那么没有任何反应。如果相反,我尝试:
self.container.bottomAnchor
.constraintEqualToAnchor(self.child.topAnchor).active = true
然后有一个关于无法同时满足约束的警告和在视觉上没有任何结果。
此外,每当我激活NSLayoutConstraint
时,约束的数量(print(container.constraints.count)
)都会增加,这不是一件好事。
所以我的问题是:
slideIn()
动画?答案 0 :(得分:12)
constraintEqualToAnchor
方法创建一个新约束。
因此,当您在幻灯片放映功能中调用self.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor)
时,您并未使用slideIn
方法中添加的约束。
要实现所需的滑出动画,您必须保留对先前约束的引用。我不确定在约束中设置.active
属性的效果在滑出功能中是什么,因为我不知道您的视图层次结构是如何设置的。
但是重用约束的一种方法是将它作为VC中的var属性保存:
lazy var bottomConstraint:NSLayoutConstraint = self.container.bottomAnchor
.constraintEqualToAnchor(self.child.bottomAnchor)
func slideOut() {
UIView.animateWithDuration(Double(0.5), animations: {
self.bottomConstraint.active = false
self.view.layoutIfNeeded()
})
}
func slideIn() {
UIView.animateWithDuration(Double(0.5), animations: {
self.bottomConstraint.active = true
self.view.layoutIfNeeded()
})
print("numConstraints: \(container.constraints.count)")
}
来自Apple Docs:
激活或取消激活约束调用addConstraint:和removeConstraint:在视图上,该视图是此约束管理的项目的最近共同祖先。
因此,您为什么要增加约束数量的原因是因为您不断创建新约束并通过将active
设置为true来添加它们。