所以我有一个自定义的UIView类
class MessageBox: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
createSubViews()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createSubViews()
}
func createSubViews() {
let testView = UIView(frame: self.frame)
testView.backgroundColor = UIColor.brown
self.addSubview(testView)
}
}
我在 Storyboard 中添加了一个UIView并赋予了一些约束:
但是,当我运行该应用程序时,我在代码中创建的棕色 subview 变大了。我在自定义 View 中打印了
self.frame
,结果发现框架是(0,0,1000,1000)
。但为什么?我设置了约束,它应该类似于(0,0,deviceWith, 180)
。我做错了什么?
编辑:那是我的 Storyboard 设置:
最佳答案
简短答案:
您做得太早了。
详细答案:
从Interface Builder文件(XIB或 Storyboard )初始化 View 时,其框架最初设置为它在Interface Builder中具有的框架。您可以将其视为临时占位符。
使用自动版式时,将在 View 的layoutSubviews()
方法内解析约束(=计算 View 的实际帧)。
因此,针对您的问题有两种可能的解决方案:
testView
并为其创建导出testView
,然后将其translatesAutoResizingMaskIntoConstraints
属性设置为false
(以“激活自动布局”的方式)并在代码中为其添加所需的约束。 testView
View 的框架本身之后,设置MessageBox
的框架。 唯一可以确定系统已根据约束解析了 View 框架的地方是在调用layoutSubviews()
时。 override func layoutSubviews() {
super.layoutSubviews()
testView.frame = self.frame
}
(当然,您需要将
testView
声明为属性/全局变量。)