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

时间:2016-08-18 14:59:11

标签: ios swift uiview storyboard

所以我有一个自定义的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(superview),从左和右0,高度是180

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

enter image description here

我做错了什么?

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

enter image description here

4 个答案:

答案 0 :(得分:18)

简短回答:

你做得太早了。

详细答案:

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

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

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

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

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

    override func layoutSubviews() {
        super.layoutSubviews()
        testView.frame = self.frame
    }
    

    (当然,您需要将testView声明为属性/全局变量。)

答案 1 :(得分:1)

尝试使用锚视图:

MessageBox.centerXAnchor.constraintEqualToAnchor(self.view.centerXAnchor).active
= true 
MessageBox.centerYAnchor.constraintEqualToAnchor(self.view.centerYAnchor).active
= true 
MessageBox.widthAnchor.constraintEqualToConstant(150).active = true 
MessageBox.heightAnchor.constraintEqualToConstant(100).active = true

此方法必须在您的课程中使用

答案 2 :(得分:1)

override func layoutSubviews() {
    super.layoutSubviews()
    testView.frame = self.frame
}

当您将自定义类添加到故事板中的UIView并使用autolayout时,这也适用。 谢谢 Mischa

答案 3 :(得分:0)

尝试相对于超视图高度添加高度和宽度约束,并使用一些乘数。