试图找到一种解决方案来更新事件上多个 UI 元素的多个约束。我见过一些停用、更改、然后重新激活约束的示例,对于我正在使用的 24 个 anchor ,此方法似乎不切实际。
我的一组更改:
ticketContainer.translatesAutoresizingMaskIntoConstraints = false
ticketContainer.topAnchor.constraintEqualToAnchor(self.topAnchor).active = true
ticketContainer.leftAnchor.constraintEqualToAnchor(self.rightAnchor, constant: 20).active = true
ticketContainer.widthAnchor.constraintEqualToConstant(200.0).active = true
ticketContainer.leftAnchor.constraintEqualToAnchor(self.leftAnchor, constant: 20).active = true
ticketContainer.widthAnchor.constraintEqualToConstant(100.0).active = true
最佳答案
您是否尝试过将使用布局 anchor 创建的相关约束保存到属性,然后只更改常量?例如
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
}
}
此扩展允许您在从 anchor 创建约束的相同方法调用中为约束设置标识符。请注意,Apple 文档暗示 XAxis anchor (左、右、前导等)不会让您使用 YAxis anchor (顶部、底部等)创建约束,但我没有观察到这实际上是真的。如果您确实想要那种类型的编译器检查,则需要为 NSLayoutXAxisAnchor
、NSLayoutYAxisAnchor
和 NSLayoutDimension
(用于宽度和高度)编写单独的扩展约束)强制执行同轴 anchor 类型要求。
接下来,您将在 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
}
请注意,使用常量或枚举代替标识符的魔术字符串名称将是对上述方法的改进,但我会保持这个答案的简短和重点。
关于ios - 如何更新快速布局 anchor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111633/