所以我有一个自定义的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)

ios - 自定义 View -self.frame不正确吗?-LMLPHP

我做错了什么?

编辑:那是我的 Storyboard 设置:

ios - 自定义 View -self.frame不正确吗?-LMLPHP

最佳答案

简短答案:

您做得太早了。

详细答案:

从Interface Builder文件(XIB或 Storyboard )初始化 View 时,其框架最初设置为它在Interface Builder中具有的框架。您可以将其视为临时占位符。

使用自动版式时,将在 View 的layoutSubviews()方法内解析约束(=计算 View 的实际帧)。

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

  • (首选)如果使用“自动版式”,请在整个 View 中使用它。
  • 也可以在Interface Builder中添加testView并为其创建导出
  • 或按您的方式在代码中创建testView,然后将其translatesAutoResizingMaskIntoConstraints属性设置为false(以“激活自动布局”的方式)并在代码中为其添加所需的约束。
  • 在布局引擎设置testView View 的框架本身之后,设置MessageBox的框架。 唯一可以确定系统已根据约束解析了 View 框架的地方是在调用layoutSubviews()时。
    override func layoutSubviews() {
        super.layoutSubviews()
        testView.frame = self.frame
    }
    

    (当然,您需要将testView声明为属性/全局变量。)
  • 10-08 03:23