我有一个 UIView 被添加到 UIViewController 中,我想确保 View 已完全加载,因为我想访问和使用这些 View 的框架。我正在 UIView 中工作,而 ViewController 仅用于测试目的。
这是我正在使用的示例:
我正在将自定义 UIView 加载到 UIViewController 中,因此按以下方式初始化 View :
在 UIViewController 中
var slideView: BSlideBar = BSlideBar(frame: CGRect(x: 0, y: 150, width: 320, height: 54))
self.view.addSubview(slideView)
在 UIView 中
override init(frame: CGRect) {
super.init(frame: frame)
customInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
customInit()
}
public func customInit() {
Bundle.main.loadNibNamed("BSlideBar", owner: self, options: nil)
self.addSubview(self.slideView)
self.slideView.frame = self.bounds
}
我有一个与我的 UIView 关联的 XIB 文件,因此正在自定义 init 函数中加载 Nib。
这个 UIView 内部还有其他 UIView,并且都被添加到 UIViewController 中。这一切工作正常,当我尝试访问这些 View 的属性时出现问题:
示例:
draggableView.layer.cornerRadius = draggableView.frame.width/2
这将使draggableView成为一个圆圈,并且还允许我将draggableView的大小基于它所包含的 View ,同时将其保持为一个圆圈。这意味着无论我用什么框架初始化它,我的 View 都将保持一致。令人烦恼的是,该框架总是作为 XIB 文件中的框架返回,而不是加载的 UIView 的框架。 (如果我在加载后单击按钮,则会返回预期和所需的帧)
示例 2:
self.centreLine.frame = CGRect(x: Int(sidePadding), y: Int(slideView.frame.height/2), width: Int(UIScreen.main.bounds.width - 2 * sidePadding), height: 2)
我再次希望此 View 能够调整到它所包含的 View 的大小。在这种情况下,它应该保持在边缘的填充范围内,并且恰好位于 View 的中间。再说一次,情况并非如此。
我尝试使用this使用以下方式回答:
-(void)awakeFromNib
override func layoutSubviews() {
super.layoutSubviews()
}
但这两个似乎都还不够晚。
问题部分是由于位于 UIView 内部,因为我通常会这样调用:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
我有点困惑,但真的很想找出这个问题发生的原因。我遇到的主要问题是简洁地寻找问题并耗尽了我当前的所有线索。
最佳答案
您关心的不是“满载”。它已“完全布局”。
覆盖layoutSubviews
:
override func layoutSubviews() {
super.layoutSubviews()
// At this point, all of my direct subviews' frames are set.
// However, their subviews (my more distant descendants)
// haven't had their frames updated yet.
}
当整个 View 层次结构完成布局时,没有特别好的方法来通知。当您收到 drawRect:
时,您可以确定所有后代都已布局,但此时您不应该修改图层属性。
关于swift - 当 UIView 完全加载时如何收到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45429422/