我在我的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最终只能填充自定义视图总空间的一半。
非常感谢任何帮助!
答案 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)