我可以创建从uiview的初始化到其Superview的约束吗

时间:2019-06-17 14:44:01

标签: swift uiview initialization

我创建了许多视图,这不是问题。但是我在VC中有很多更改约束代码,需要重构。

问题:

如何(如果可能)如何在subView本身的init方法内设置约束,以便可以从VC中重构代码。

我想不出另一种方法来说明我对Google的问题,所以这是香港专业教育学院得到的内容:

VC

    func addCheckView() {
        let checkView = CheckView()
        checkView.frame = self.view.frame
        view.insertSubview(checkView, aboveSubview: mapView)
    }
import UIKit

class CheckView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }


    private func commonInit() {
        backgroundColor = .blue
//        addSubview(self)
        translatesAutoresizingMaskIntoConstraints = false
//        let margins = layoutMarginsGuide
        leadingAnchor.constraint(equalTo: leadingAnchor, constant: 40).isActive = true
        trailingAnchor.constraint(equalTo: trailingAnchor, constant: -40).isActive = true
        topAnchor.constraint(equalTo: topAnchor, constant: 40).isActive = true
        bottomAnchor.constraint(equalTo: bottomAnchor, constant: -40).isActive = true
//        layoutIfNeeded()
    }
}

我已经尝试了多种变体,但是为了使它简短易读(并且我认为解决方案很简单),我将保留它。

很明显,我可以简单地做这样的事情,并通过以下方式进行触摸:

private func commonInit() {
let view = CheckView()
// add constraints here, etc.
}

这可行,但是这不只是在子视图中添加子视图吗?这似乎不雅且冗长。

1 个答案:

答案 0 :(得分:1)

在具有 超级视图之前,您无法将视图限制为其超级视图。但是init发生在一个超级视图之前,因此您不能将约束代码移入其中。而是在您的UIView子类中实现didMoveToSuperview()。现在,self.superview第一次不是nil,并且视图可以将自身约束为其超级视图。