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

所以我有一个自定义的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 from the top (superview),0 from the left and right,height is 180

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

我做错了什么?

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

解决方法

简短回答:

你做得太早了.

详细解答:

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

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

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

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

>也可以在Interface Builder中添加testView并为其创建一个插座
>或者像在您的代码中一样在代码中创建testView,然后将其translatesAutoResizingMaskIntoConstraints属性设置为false(以“激活自动布局”排序)并在代码中为其添加所需的约束.

>在布局引擎设置MessageBox视图的框架后,设置testView的框架.您可以确定系统已从约束中解析视图框架的唯一位置是调用layoutSubviews()时.

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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...