从约束数组中访问特定约束

时间:2018-03-01 11:51:22

标签: ios swift nslayoutconstraint

假设您有一系列约束

let constraints = [NSLayoutConstraints]

我想以某种方式使用下标访问顶部锚点。我试过了

extension Array where Element: NSLayoutConstraint {

enum LayoutAnchor {
    case top
    //case left
    //case bottom
    //case right
}

subscript(anchor: LayoutAnchor) -> NSLayoutConstraint? {
    switch anchor {
    case .top: return self.index(of: topAnchor)
    }
}
}

所以我可以致电anchors[.top]来访问顶级主播。在这种情况下,我如何直接访问锚点数组中的顶部锚点?

1 个答案:

答案 0 :(得分:1)

我不确定你的目标是什么,但你需要以某种方式识别NSLayoutConstraint

我将顶部约束的标识符设置为LayoutAnchor类型,然后constraints[.top]很容易构建。但这不安全,因为数组可能包含多个具有相同类型的约束,或者根本不包含。 请注意constraints[.bottom]nil,因为未在底部设置标识符。

下面是操场上的一段摘录,希望有所帮助。

enum LayoutAnchor: String {
    case top
    case left
    case bottom
    case right
}

extension Array where Element: NSLayoutConstraint {
    subscript(anchor: LayoutAnchor) -> NSLayoutConstraint? {
        switch anchor {
        case .top:
            return self.filter { $0.identifier == LayoutAnchor.top.rawValue }.first
        case .bottom:
            return self.filter { $0.identifier == LayoutAnchor.bottom.rawValue }.first
        case .left:
            return self.filter { $0.identifier == LayoutAnchor.left.rawValue }.first
        case .right:
            return self.filter { $0.identifier == LayoutAnchor.right.rawValue }.first
        }
    }
}

let view1 = UIView()
let view2 = UIView()

let top = view1.topAnchor.constraint(equalTo: view2.topAnchor)
top.identifier = LayoutAnchor.top.rawValue

let constraints: [NSLayoutConstraint] = [
    top,
    view1.bottomAnchor.constraint(equalTo: view2.bottomAnchor)
]

constraints[.top]
constraints[.bottom]