ios – 制作一个自定义的UIView子视图,填充其超级视图

前端之家收集整理的这篇文章主要介绍了ios – 制作一个自定义的UIView子视图,填充其超级视图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我用自己的初始化程序编写了自己的自定义视图.但是,当我的主视图加载我的自定义视图时,会以错误的方式进行描述.它的边界为600×600矩形,而superview为375×607.我确实试图把自动约束,似乎没有工作.我尝试在子视图初始化中以编程方式执行此操作,但每当我尝试将其bounds属性初始化为其superview边界时,我在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初始化视图的方式.

有任何想法吗 ?

谢谢.

解决方法

首先,Views init方法不是执行布局的最佳位置.视图可以在稍后调整大小,如果从Xib加载视图或者在View Controllers viewDidLoad函数中创建视图,则通常总是这样.

话虽如此,你有几种方法

1.使用自动布局

Interface Builder

这可以在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-|",views: viewsDict))
    addSubview(view)
}

convenience required init(coder aDecoder: NSCoder) {
    self.init(frame: .zero)
}

2.手动布局

调整面具大小

为此,您可以使用调整大小的蒙版,也可以在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
}

猜你在找的iOS相关文章