swift - 当 UIView 完全加载时如何收到通知

标签 swift uiview layoutsubviews

我有一个 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/

相关文章:

ios - 将文件从 Google Drive 共享到 Dropbox,反之亦然

swift - 正则表达式替换每行的空格

ios - 当没有 self.view 时,如何找到 UIView...?

ios - 如何使用 iOS5 的 viewcontroller 创建通用 View ?

swift - 将 NavigationBar subview 放在 NavigationBarItem 和标题后面

ios - UIScrollView 内容大小在不应该的时候裁剪 subview

ios与layoutSubviews相反的是什么

ios - map 注释不会显示 rightCalloutAccessoryView 的自定义 UIButton

ios - 应用程序在苹果审核时崩溃,但在本地开发时不会崩溃

ios - 如何使所有设备上的动画 View 与屏幕底部的距离保持一致?