如何存储映射到UIView类的自动布局锚点

时间:2019-01-13 10:22:19

标签: swift autolayout

我目前正在使用一个非常互动的UI。需要基于userInput移动视图。我大约有六个视图,所有子UI元素都存储为单独的类。在我的主viewController中,我想处理这些视图约束的重置。为此,我需要将NSLayout约束存储在某个位置。将它们全部都放入我的viewController中感觉不对。

我已经经历了很多迭代,但是每次看来我都需要手动创建所有NSlayoutconstraint属性并将其分别存储在父Viewcontroller上。

我不需要的是具有功能的UI扩展,该功能可以设置约束并将其存储在该类上的属性,以便我可以随意停用或更改它们。

extension UIView {

func anchorFixedHeight(
        top: NSLayoutAnchor<NSLayoutYAxisAnchor>,
        lead: NSLayoutAnchor<NSLayoutXAxisAnchor>,
        trail: NSLayoutAnchor<NSLayoutXAxisAnchor>,
        height: CGFloat,
        Ypadding: CGFloat,
        Xpadding: CGFloat)
    {
        self.topAnchor.constraint(equalTo: top, constant: Ypadding)
        self.heightAnchor.constraint(equalToConstant: height)
        self.leadingAnchor.constraint(equalTo: lead, constant: Xpadding)
        self.trailingAnchor.constraint(equalTo: trail, constant: -Xpadding)
    }

}

但这不会起作用,因为NSlayouconstrain.activate()接受约束数组,一旦设置了achor,它将变成锚定约束。

我一直试图将它们存储为属性,但是迅速不会允许扩展中存储属性。但是我也不想,但是我也不想在所有视图中复制所有这些约束属性。

1 个答案:

答案 0 :(得分:0)

您可能需要类似的东西

class CusView:UIView {

     var top:NSLayoutConstraint!
     var lead:NSLayoutConstraint!
     var tra:NSLayoutConstraint!
     var heigh:NSLayoutConstraint!

    override func didMoveToSuperview() {
        super.didMoveToSuperview()

       self.translatesAutoresizingMaskIntoConstraints = false
       top =  self.topAnchor.constraint(equalTo:self.superview!.topAnchor, constant: 12)
       heigh =   self.heightAnchor.constraint(equalToConstant: 12)
       lead =  self.leadingAnchor.constraint(equalTo:self.superview!.leadingAnchor, constant: 12)
       tra =  self.trailingAnchor.constraint(equalTo:self.superview!.trailingAnchor, constant: -12)

        NSLayoutConstraint.activate([top,lead,tra,heigh])


    }
}