2017-08-01 98 views
0

我有一个UIView被添加到UIViewController,我想确保视图已经完全加载,因为我想访问和使用这些视图的框架。我在UIView内工作,ViewController仅用于测试目的。如何在UIView完全加载时得到通知

这里是我一起工作的例子:

我加载自定义的UIView到一个UIViewController所以我初始化下列方式的观点:

在UIViewController中

var slideView: BSlideBar = BSlideBar(frame: CGRect(x: 0, y: 150, width: 320, height: 54)) 

self.view.addSubview(slideView) 

在UIView

我有一个XIB文件作为与我的UIView相关联,所以我在自定义init函数中加载了Nib。

这个UIView里面有其他的UIViews,并且都被添加到了UIViewController中。这是所有工作正常,问题是当我试图访问这些意见的属性:

例子:

draggableView.layer.cornerRadius = draggableView.frame.width/2 

这将使draggableView了一圈,也让我基地的规模包含在视图中的draggableView同时将其保持为圆形。这意味着我的观点将保持一致,无论我初始化它的框架。令人讨厌的是,框架总是作为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) 

我再次想此视图可调节到该视图的大小,它包含在这种情况下,它应该保持在边缘的填充范围内,并且完全位于视图的中间。事实并非如此。

我试图用使用this答案:

-(void)awakeFromNib 

override func layoutSubviews() { 
    super.layoutSubviews() 
} 

但是这些都似乎被称为足够晚。

问题部分是由于作为一个UIView里面,因为我通常会叫这样的:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
} 

我略有困惑,但在找出为什么这个问题会发生真正的兴趣。我面临的主要问题是简明地搜索问题,并耗尽了我目前的所有线索。

+0

https://stackoverflow.com/questions/4501974/uiview-how-to-get-notified-when-the-view-is-loaded –

+0

我已经将此问题链接到我的问题。这可能是我误解了哪个函数是适合使用的函数。任何额外的解释将是伟大的 –

回答

0

在您的视图类中,创建一个加载该笔尖并返回加载的视图的类函数。利用它来进行初始化视图

的UIView

class func loadViewFromNib() -> BSlideBar 
    guard let nibs = Bundle.main.loadNibNamed("BSlideBar", owner: self, options: nil) as? [UIVIew] else { assertFailure(): return UIView() } 

    return nibs.first as! BSlideBar 
} 

初始化你的变量在你UIViewVontroller,配置视图,然后将其添加到子视图

var slideBar: BSlideBar = BSlideBar.loadViewFromNib() 
slideBar.frame = CGRect(.....) 
addSubview(slideBar) 

应该工作,但我要去在我回答之前仔细检查“为什么”,不想给你不好的信息。

0

它并不是您所关心的“完全加载”。这是“完全布局”。

覆盖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. 
} 

没有特别当整个视图层次结构已经完成布局通知好办法。当你收到drawRect:时,你可以确定所有的后代已经布置完毕,但是你不应该在这一点上修改图层属性。

+0

当我尝试这个主UIView是由它的子视图布置不(作为您的答案中的评论建议)。你提到所有的后代将被放置在drawRect上:在我们被允许修改图层属性之前有一段时间吗? –

相关问题