我创建了许多视图,这不是问题。但是我在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.
}
这可行,但是这不只是在子视图中添加子视图吗?这似乎不雅且冗长。
答案 0 :(得分:1)
在具有 超级视图之前,您无法将视图限制为其超级视图。但是init
发生在一个超级视图之前,因此您不能将约束代码移入其中。而是在您的UIView子类中实现didMoveToSuperview()
。现在,self.superview
第一次不是nil
,并且视图可以将自身约束为其超级视图。