在init

时间:2017-01-07 18:38:57

标签: swift cocoa-touch uiview ios10

我在我的iOS应用程序中创建了UIView的自定义子类,我试图在视图的init方法中获取视图的计算大小,因此我可以在创建子视图时使用它们放入自定义视图。< / p>

自定义视图位于堆栈视图中,该视图将我的视图分配为总(主视图)高度的1/3。

我的init看起来像这样:

var mySubView: UIImageView

required init?(coder aDecoder: NSCoder) {

    mySubView = UIImageView()
    super.init(coder: aDecoder)

    let viewWidth = Int(self.frame.size.width)
    let viewHeight = Int(self.frame.size.height)
    mySubView.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
    mySubView.backgroundColor = UIColor.cyan

    self.addSubview(mySubView)
}

但是,高度和宽度未正确报告。例如,上面的mySubView最终只能填充自定义视图总空间的一半。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

初始化程序在视图的生命周期中过早调用,以准确地进行布局,除非您事先知道确切的尺寸。即便如此,它仍然是错误的地方。

尝试使用layoutSubviews方法:

class SubView: UIImageView {

    var mySubView: UIImageView

    required init?(coder aDecoder: NSCoder) {

        mySubView = UIImageView()
        mySubView.backgroundColor = UIColor.cyan

        super.init(coder: aDecoder)
        self.addSubview(mySubView)
    }

    override func layoutSubviews() {
        mySubView.frame = self.bounds
        super.layoutSubviews()
    }
}

现在,将在每个布局过程的开头正确设置子视图边界。这是一个廉价的操作。

此外,bounds的{​​{1}}属性是UIView转换为视图的内部坐标空间。这意味着通常这是真的:frame。我建议阅读有关视图布局的文档。

或者,您可以完全放弃手动布局,并使用AutoLayout为您执行此操作。

bounds = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)