2014-12-26 33 views
18

我是一名新的開發人員iOS。如何通過自動佈局獲得實際大小的UIView

我使用自動佈局。

我有一個問題。約束後我無法獲得真實大小的UIView。

例如,當我想要得到的UIView大小與約束

self.container.frame.size.height 

它送花兒給人的所有設備大小返回550。但是當我在不同的設備上運行它時,我可以看到它有不同的大小。

感謝

回答

11

最簡單的解決方法就是運行-viewDidAppear:代碼(自動版式已運行後)。

+0

感謝。但如何做,如果我想在viewDidLoad中獲得真正的大小。你有任何解決方案? – Chicken

+0

@Chicken見艾倫的解決方案。這將強制自動佈局立即運行。你真的應該避免做這種事情,尤其是不止一次。 – Oxcug

0

最好的時刻是在viewDidLayoutSubviews期間,因爲它發生在viewDidAppear之前,因此您仍然可以在顯示視圖之前做一些修改。

35

你的 「得到真正的尺寸代號」 之前,插入下面的代碼:

[view setNeedsLayout]; 
[view layoutIfNeeded]; 
+2

恕我直言,不需要同時調用'[view setNeedsLayout]'和'[view layoutIfNeeded]',只有後者對於'viewWillLayoutSubviews'中的我來說已經足夠了。 – schmidt9

+0

它不起作用 –

13

由於每個人都認爲訪問是通過完成的而不是在UIView子類中,答案並不證明真的有用。獲得UIView子類的正確大小的正確方法是layoutSubviews

0

[view layoutIfNeed]救救我。

使用此方法可在繪製之前強制子視圖的佈局。使用接收消息作爲根視圖的視圖,此方法將從根開始的視圖子樹佈局。

調用此方法後,我可以在xib中獲得自定義視圖的實際大小。 非常感謝@Allen和作者。

6

這太棒了。

如果你想獲得幀沒有自動佈局在使用過程中使用layoutsubviews方法,使用這一個:

dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"View frame: %@", NSStringFromCGRect(view.frame)); 
    }) 
+0

謝謝你的想法。這裏沒有什麼奇怪的:你在回到主調度隊列後要求調用這個代碼。這將在自動佈局發生後發生。的確非常有用! – ishahak

+1

謝謝。薩姆說並不奇怪。也是比這個子類更好的解決方案。 –

相關問題