我可以从 uiview 的初始化到它的 superview 创建约束吗

Can i create constraints, from within a uiview's initialization, to its superview

我创建了很多视图,这不是问题。但是我在 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.
}

这是可行的,但这不只是在子视图中添加子视图吗?这看起来既不雅又冗长。

在视图 具有 父视图之前,您不能将其约束到其父视图。但是 init 发生在有父视图之前,因此您不能将约束代码移入其中。相反,在您的 UIView 子类中,实现 didMoveToSuperview()。现在第一次 self.superview 不是 nil 并且视图可以将自己约束到它的父视图。