所以我有一个自定义的 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)
}
}
我在故事板中添加了一个 UIView 并给了它一些约束:
距顶部100(超级视图),距左右各0,高度为180
但是当我运行应用程序时,我在代码中创建的棕色子视图太大了。我打印了self.frame
在我的自定义视图中,事实证明框架是(0,0,1000,1000)
。但为什么?我设置了约束,应该是这样的(0,0,deviceWith, 180)
.
我做错了什么?
编辑:这是我的故事板设置:
简短而简单的答案:
你这样做太早了。
详细解答:
当视图从 Interface Builder 文件(xib 或 Storyboard)初始化时,其框架最初设置为 Interface Builder 中的框架。您可以将其视为临时占位符。
当使用自动布局时,约束在视图的内部解决(=计算视图的实际框架)layoutSubviews()
method.
因此,您的问题有两种可能的解决方案:
-
(最好)如果您使用自动布局,请在整个视图中使用它。
- 要么添加您的
testView
也在 Interface Builder 中并为其创建一个出口
- 或创建您的
testView
像你一样在代码中,然后设置它的translatesAutoResizingMaskIntoConstraints
财产给false
(排序“激活自动布局”)并在代码中添加所需的约束。
-
设置你的testView
之后的帧MessageBox
视图的框架本身已由布局引擎设置。唯一可以确定系统已从约束中解析视图框架的地方是layoutSubviews()
叫做。
override func layoutSubviews() {
super.layoutSubviews()
testView.frame = self.frame
}
(您需要声明您的testView
当然,作为属性/全局变量。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)