制作一个自定义的 UIView 子视图来填充它的超级视图
Making a custom UIView subview that fills its superview
所以我用自己的初始化程序编写了自己的自定义视图。但是,当我的主视图加载时,我的自定义视图以错误的方式描绘。它以 600x600 的矩形为边界,而 superview 为 375x607。我确实尝试过自动约束,似乎不起作用。我试图在子视图初始化中以编程方式执行此操作,但每当我尝试将其边界 属性 初始化为其超级视图边界时,我在超级视图中得到 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()
}
我尝试了互联网上所有让子视图填充其父视图的方法,但我认为子视图在父视图之前被初始化?那可能吗 ?在 ViewController 中,将我的自定义视图声明为 Outlet 连接。我敢肯定这个问题应该非常简单而且是我不知道 Swift 初始化视图的方式。
有什么想法吗?
谢谢。
首先,Views init 方法不是执行布局的最佳位置。视图可以在以后调整大小,如果视图是从 Xib 加载的或者您是在视图控制器 viewDidLoad
函数中创建的,通常情况总是如此。
也就是说你有几种方法:
1。使用自动布局
界面生成器
这可以在 Interface Builder 中或以编程方式完成。在 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。手动布局
调整蒙版大小
为此,您可以使用调整大小的遮罩,也可以在 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
}
所以我用自己的初始化程序编写了自己的自定义视图。但是,当我的主视图加载时,我的自定义视图以错误的方式描绘。它以 600x600 的矩形为边界,而 superview 为 375x607。我确实尝试过自动约束,似乎不起作用。我试图在子视图初始化中以编程方式执行此操作,但每当我尝试将其边界 属性 初始化为其超级视图边界时,我在超级视图中得到 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()
}
我尝试了互联网上所有让子视图填充其父视图的方法,但我认为子视图在父视图之前被初始化?那可能吗 ?在 ViewController 中,将我的自定义视图声明为 Outlet 连接。我敢肯定这个问题应该非常简单而且是我不知道 Swift 初始化视图的方式。
有什么想法吗?
谢谢。
首先,Views init 方法不是执行布局的最佳位置。视图可以在以后调整大小,如果视图是从 Xib 加载的或者您是在视图控制器 viewDidLoad
函数中创建的,通常情况总是如此。
也就是说你有几种方法:
1。使用自动布局
界面生成器
这可以在 Interface Builder 中或以编程方式完成。在 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。手动布局
调整蒙版大小
为此,您可以使用调整大小的遮罩,也可以在 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
}