所以我用自己的初始化程序编写了自己的自定义视图。但是,当我的主视图加载我的自定义视图时,会以错误的方式进行描述。它的边界为600x600矩形,而superview为375x607。我确实试图把自动约束,似乎没有工作。我尝试在子视图初始化中以编程方式执行此操作,但每当我尝试将其边界属性初始化为其超视图边界时,我在superview中得到nil。
override init(frame: CGRect) {
super.init(frame: frame)
self.setup()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
func setup() {
initPathLayer()
initHandleView()
initHandlePanGestureRecognizer()
layoutPathLayer()
layoutHandleViews()
}
我尝试了互联网上的所有内容,使子视图填充其超级视图,但我认为子视图在superview之前被初始化了?那可能吗 ?在ViewController中,我将自定义视图声明为Outlet连接。我确信问题应该非常简单,而且我不知道Swift初始化视图的方式。
有什么想法吗?
谢谢。
答案 0 :(得分:24)
首先,Views init方法不是执行布局的最佳位置。视图可以在稍后调整大小,如果视图是从Xib加载的,或者您是在View Controllers viewDidLoad
函数中创建视图,则通常总是如此。
据说你有几种方法:
这可以在Interface Builder中或以编程方式完成。在Interface Builder中,您只需使用“Pin”选项并选择视图的所有边
完成此操作后,您应该能够在“大小”检查器中看到您的约束,如下所示:
或者,您始终可以在初始化程序中以编程方式添加约束:
override init(frame: CGRect) {
let view = UIView(frame: .zero)
view.translatesAutoresizingMaskIntoConstraints = false
super.init(frame: frame)
let viewsDict = ["view": view]
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: .allZeros, metrics: nil, views: viewsDict))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: .allZeros, metrics: nil, views: viewsDict))
addSubview(view)
}
convenience required init(coder aDecoder: NSCoder) {
self.init(frame: .zero)
}
为此,您可以使用调整大小的蒙版,也可以在layoutSubviews中控制框架。调整掩码大小会告诉系统视图应如何相对于superview进行调整大小:
override init(frame: CGRect) {
let view = UIView(frame: CGRectZero)
view.translatesAutoresizingMaskIntoConstraints = false
super.init(frame: frame)
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
}
最后,您可以覆盖layoutSubviews并从那里开始:
override func layoutSubviews() {
super.layoutSubviews()
view.frame = bounds
}