ios - 如何更新快速布局 anchor ?

标签 ios swift autolayout layout-anchor

试图找到一种解决方案来更新事件上多个 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
}

可能更优雅

根据您编写扩展的喜好,这里有一个可能更优雅的方法,它不使用属性,而是在 NSLayoutAnchorUIView 上创建扩展方法来帮助更简洁的用法。

首先你会像这样在 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 (顶部、底部等)创建约束,但我没有观察到这实际上是真的。如果您确实想要那种类型的编译器检查,则需要为 NSLayoutXAxisAnchorNSLayoutYAxisAnchorNSLayoutDimension(用于宽度和高度)编写单独的扩展约束)强制执行同轴 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/

相关文章:

ios - 以编程方式添加到 UIStackView 时的 sizeToFit UIButton

ios - 如何将自定义 View 添加到 JSQMessagesViewController 单元格,以便它包含一个带有一些按钮和 TextView 的 View ?

swift - Swift、自动布局和堆栈 View 的问题

ios - UIDatePicker 最小和最大高度

swift - UIButton的 Action 自动需要延迟响应

ios - 以编程方式向 TextView 添加约束

ios - 在 arm64 上将字符串转换为整数?

ios - 无法使用 Swift 从 Firebase 检索数据

ios - 了解 'lldb' backtace - 按下按钮时应用程序崩溃

ios - 自定义表格单元格: "class is not key value coding-compliant"