自定义视图 - self.frame不正确?

Qua*_*ntm 8 storyboard uiview ios swift

所以我有一个自定义的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我在故事板中添加了一个UIView并给它一些约束:

从顶部100(superview),从左和右0,高度是180

但是当我运行应用程序时,我在代码中创建的棕色子视图是很大的.我self.frame在我的自定义视图中打印,结果表明框架是(0,0,1000,1000).但为什么?我设置约束,应该是这样的(0,0,deviceWith, 180).

在此输入图像描述

我做错了什么?

编辑:这是我的故事板设置:

在此输入图像描述

Mis*_*cha 18

简短的答案:

你做得太早了.


详细解答:

从Interface Builder文件(xib或storyboard)初始化视图时,其框架最初设置为Interface Builder中的框架.您可以将其视为临时占位符.

使用自动布局时,在视图的layoutSubviews()方法中解析约束(=计算视图的实际帧).

因此,您的问题有两种可能的解决方案:

  1. (首选)如果您使用自动布局,请在整个视图中使用它.

    • 您也可以testView在Interface Builder中添加它并为其创建一个插座
    • 或者testView像你一样创建代码,然后将其translatesAutoResizingMaskIntoConstraints属性设置为false(以激活"自动布局")并在代码中为其添加所需的约束.
  2. 在布局引擎设置视图的框架本身testView后设置您的框架MessageBox.您可以确定系统已从约束中解析视图框架的唯一位置layoutSubviews()是调用时.

    override func layoutSubviews() {
        super.layoutSubviews()
        testView.frame = self.frame
    }
    
    Run Code Online (Sandbox Code Playgroud)

    (当然,你需要声明你testView的属性/全局变量.)