gpt4 book ai didi

swift - 在 init 中获取 UIView 的大小

转载 作者:搜寻专家 更新时间:2023-10-31 08:31:35 24 4
gpt4 key购买 nike

我在我的 iOS 应用程序中创建了 UIView 的自定义子类,我试图在 View 的 init 方法中获取 View 的计算大小,因此我可以在创建 subview 以放入自定义 View 时使用它们。

自定义 View 位于堆栈 View 内,它为我的 View 分配了总(主视图)高度的 1/3。

我的初始化看起来像这样:

var mySubView: UIImageView

required init?(coder aDecoder: NSCoder) {

mySubView = UIImageView()
super.init(coder: aDecoder)

let viewWidth = Int(self.frame.size.width)
let viewHeight = Int(self.frame.size.height)
mySubView.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
mySubView.backgroundColor = UIColor.cyan

self.addSubview(mySubView)
}

但是,高度和宽度没有正确报告。例如,上面的 mySubView 最终只填充了自定义 View 总空间的大约一半。

如有任何帮助,我们将不胜感激!

最佳答案

初始化程序在 View 的生命周期中调用得太早,无法准确地进行布局,除非您事先知道确切的尺寸。即便如此,从惯用的角度来说,这也是错误的地方。

尝试使用 layoutSubviews 方法:

class SubView: UIImageView {

var mySubView: UIImageView

required init?(coder aDecoder: NSCoder) {

mySubView = UIImageView()
mySubView.backgroundColor = UIColor.cyan

super.init(coder: aDecoder)
self.addSubview(mySubView)
}

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

现在, subview 边界将在每个布局 channel 开始时正确设置。这是一个廉价的操作。

此外,UIViewbounds 属性是转换为 View 内部坐标空间的frame。这意味着通常这是真的:bounds = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)。我建议阅读有关 View 布局的文档。

或者,您可以完全放弃手动布局,使用 AutoLayout 为您完成此操作。

class SubView: UIImageView {

var mySubView: UIImageView

required init?(coder aDecoder: NSCoder) {

mySubView = UIImageView()
mySubView.backgroundColor = UIColor.cyan

super.init(coder: aDecoder)
self.addSubview(mySubView)

mySubView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
mySubView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
mySubView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
mySubView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true
}
}

关于swift - 在 init 中获取 UIView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41525083/

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