2017-08-01 99 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上:在我們被允許修改圖層屬性之前有一段時間嗎? –

相關問題