制作一个自定义的UIView子视图来填充它的超级视图

所以我用自己的初始化器编写了自己的自定义视图。 但是,当我的主视图加载我的自定义视图被描绘了一个错误的方式。 它的边界为600×600的矩形,而超视图为375×607。 我曾试图把汽车约束,似乎不工作。 我试图在子视图初始化中以编程方式执行它,但每当我尝试初始化它的界限属性到它的超级视图界限时,我都会在超级视图中得到零。

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() } 

我试过在互联网上的所有东西,使子视图填充其超视图,但我认为,子视图获得超视图之前初始化? 那可能吗 ? 在ViewController中,将我的自定义视图声明为Outlet连接。 我敢肯定,这个问题应该是非常容易的,这是我不知道Swift初始化视图的方式。

有任何想法吗 ?

谢谢。

首先,Views init方法不是执行布局的最佳位置。 视图可以在稍后resize,如果视图是从Xib加载的,或者您正在View Controller的viewDidLoad函数中创build视图,则通常情况下总是这样。

这就是说你有几种方法:

1.使用自动布局

界面生成器

这可以在界面生成器中或以编程方式完成。 在Interface Builder中,只需使用“Pin”选项并select视图的所有边

针约束

完成后,您应该能够在尺寸检查器中看到您的约束,如下所示:

尺寸检查员

编程

或者,您可以随时在初始化程序中以编程方式添加您的约束:

 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) } 

2.手动布局

resize的面具

为此,您可以使用resize掩码,也可以在layoutSubviews中控制框架。 调整掩码大小告诉系统如何相对于超级视图来确定视图大小:

 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 }