您是否尝试过将使用布局锚创建的相关约束保存到属性,然后只更改常量?例如
var ticketTop : NSLayoutConstraint?
func setup() {
ticketTop = ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor, constant:100)
ticketTop.active = true
}
func update() {
ticketTop?.constant = 25
}
可能更优雅
根据您编写扩展的喜好,这里可能是一种更优雅的方法,它不使用属性,而是创建扩展方法NSLayoutAnchor
并UIView
帮助更简洁的使用。
首先你会写一个NSLayoutAnchor
这样的扩展:
extension NSLayoutAnchor {
func constraintEqualToAnchor(anchor: NSLayoutAnchor!, constant:CGFloat, identifier:String) -> NSLayoutConstraint! {
let constraint = self.constraintEqualToAnchor(anchor, constant:constant)
constraint.identifier = identifier
return constraint
}
}
此扩展允许您在从锚点创建它的同一方法调用中在约束上设置标识符。请注意,Apple 文档暗示 XAxis 锚点(左、右、前导等)不会让您使用 YAxis 锚点(顶部、底部等)创建约束,但我没有观察到这实际上是真的。如果您确实想要这种类型的编译器检查,则需要为 、 和 (用于宽度和高度约束)编写单独的扩展NSLayoutXAxisAnchor
,NSLayoutYAxisAnchor
以NSLayoutDimension
强制执行同轴锚类型要求。
接下来,您将编写一个扩展UIView
以通过标识符获取约束:
extension UIView {
func constraint(withIdentifier:String) -> NSLayoutConstraint? {
return self.constraints.filter{ $0.identifier == withIdentifier }.first
}
}
有了这些扩展,你的代码就变成了:
func setup() {
ticketContainer.topAnchor.constraintEqualToAnchor(anchor: self.topAnchor, constant:100, identifier:"ticketTop").active = true
}
func update() {
self.constraint(withIdentifier:"ticketTop")?.constant = 25
}
请注意,对标识符使用常量或枚举而不是魔术字符串名称将是对上述内容的改进,但我将保持这个答案的简短和重点。