从UIView获取nslayoutconstraints

时间:2016-12-03 05:45:52

标签: ios swift

在我使用锚属性设置约束之后,例如这个。

pageControl.anchorWithFixedHeight(nil, leading: view.leadingAnchor, bottom: view.bottomAnchor, trailing: view.trailingAnchor, topConstant: 0, leadingConstant: 0, bottomConstant: 0, trailingConstant: 0, heightConstant: 30)

其中anchorWithFixedHeight只是一个辅助函数,如下所示:

func anchorWithFixedHeight(_ top: NSLayoutYAxisAnchor? = nil, leading: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, trailing: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leadingConstant: CGFloat = 0, bottomConstant: CGFloat = 0, trailingConstant: CGFloat = 0, heightConstant: CGFloat = 0) -> [NSLayoutConstraint] {

    translatesAutoresizingMaskIntoConstraints = false


    if let top = top {
        anchors.append(topAnchor.constraint(equalTo: top, constant: topConstant))
    }

    if let leading = leading {
        anchors.append(leadingAnchor.constraint(equalTo: leading, constant: leadingConstant))
    }

    if let bottom = bottom {
        anchors.append(bottomAnchor.constraint(equalTo: bottom, constant: bottomConstant))
    }

    if let trailing = trailing {
        anchors.append(trailingAnchor.constraint(equalTo: trailing, constant: trailingConstant))
    }

    anchors.append(heightAnchor.constraint(equalToConstant: heightConstant))

}

现在,让我们说我希望得到底部锚点约束来改变它的属性,我怎样才能实现呢?

提前致谢

编辑:这里的锚点是一个NSlayoutContraint数组。我当前的方法以这样的方式工作:我将所有需要的约束附加到此数组中,然后获取任何约束,例如来自此数组的底部锚约束。

然而,我觉得解决方案不够雄辩。因此,想知道是否还有其他更好的方法。

1 个答案:

答案 0 :(得分:3)

让我们先清理你方法的签名。由于常量没有相应的锚点是没用的,让我们将它们一起传递给元组。我们还应该在它返回之后命名函数,即约束,而不是锚点。

如果要通过约束来访问约束,我们可以通过返回键类型为NSLayoutAttribute且值类型为NSLayoutConstraint的字典以类型安全的方式执行此操作。因此,我们将这样称为新方法:

let root = UIView()
let view = UIView()
root.addSubview(view)

let constraints = view.helperConstraints(
    leading: (root.leadingAnchor, 20),
    bottom: (root.bottomAnchor, 10),
    trailing: (root.trailingAnchor, 20),
    heightConstant: 30)

// Activate all the new constraints.
NSLayoutConstraint.activate(Array(constraints.values))

// Change the constant of the bottom constraint.
constraints[.bottom]!.constant = 40

实施与您的实施没有什么不同:

extension UIView {

    func helperConstraints(
        top: (NSLayoutYAxisAnchor, CGFloat)? = nil,
        leading: (NSLayoutXAxisAnchor, CGFloat)? = nil,
        bottom: (NSLayoutYAxisAnchor, CGFloat)? = nil,
        trailing: (NSLayoutXAxisAnchor, CGFloat)? = nil,
        heightConstant: CGFloat? = nil) -> [NSLayoutAttribute: NSLayoutConstraint] {

        translatesAutoresizingMaskIntoConstraints = false
        var constraints = [NSLayoutAttribute: NSLayoutConstraint]()

        if let (anchor, constant) = top {
            constraints[.top] = topAnchor.constraint(equalTo: anchor, constant: constant)
        }

        if let (anchor, constant) = leading {
            constraints[.leading] = leadingAnchor.constraint(equalTo: anchor, constant: constant)
        }

        if let (anchor, constant) = bottom {
            constraints[.bottom] = bottomAnchor.constraint(equalTo: anchor, constant: constant)
        }

        if let (anchor, constant) = trailing {
            constraints[.trailing] = trailingAnchor.constraint(equalTo: anchor, constant: constant)
        }

        if let constant = heightConstant {
            constraints[.height] = heightAnchor.constraint(equalToConstant: constant)
        }

        return constraints
    }

}