gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:05 25 4
gpt4 key购买 nike

所以我有一个自定义的 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 并给它一些约束:

100 from the top (superview), 0 from the left and right, height is 180

但是当我运行应用程序时,我在代码中创建的棕色 subview 太大了。我在我的自定义 View 中打印了 self.frame,结果发现框架是 (0,0,1000,1000)。但为什么?我设置了约束,它应该类似于 (0,0,deviceWith, 180)

enter image description here

我做错了什么?

编辑:这是我的 Storyboard设置:

enter image description here

最佳答案

简短的回答:

你做得太早了。


详细答案:

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

当使用自动布局时,在 View 的 layoutSubviews() 方法中解析约束(= 计算 View 的实际框架)。

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

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

    • 也可以在 Interface Builder 中添加您的 testView 并为其创建一个 outlet
    • 或像您一样在代码中创建您的 testView,然后将其 translatesAutoResizingMaskIntoConstraints 属性设置为 false(类似于“激活自动布局” ) 并在代码中为其添加所需的约束。
  2. MessageBox View 的框架本身由布局引擎设置后,设置您的 testView 的框架。 唯一可以确定系统已从约束中解决 View 框架的地方是调用 layoutSubviews() 时。

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

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

关于ios - 自定义 View - self.frame 不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39021503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com