2013-02-26 72 views
2

我有一個ViewController與它的UIScrollView。在此VC上,我編程調整滾動視圖內的UILabel的框架。這是在viewDidLoad上完成的。這個UILabel來自VC的xib文件,它不是以編程方式創建的,只是它的框架發生了變化。layoutSubview UILabel的重置屬性

當我從這個VC轉換到另一個,然後返回時,UILabel的幀被重置爲XIB的狀態。這是文本,但沒有重置,它保持與我之前設置的相同的文本。

我的調查告訴我,這發生在layoutSubviews,作爲UILabel的性質是正確的willLayoutSubviews,然後搬回VC當didLayoutSubviews復位。

這是預期的行爲?標籤的文字仍然存在,但框架被重置?這是因爲每當滾動時,UIScrollView就在其父視圖上調用layoutSubviews?

謝謝

+0

您的xib是否啓用了自動佈局功能?請參閱[本答案](http://stackoverflow.com/a/13201690/77567)尋求幫助。 – 2013-02-26 04:03:46

+0

是的,但我希望如此,爲我的3.5和4英寸iPhone手機的視圖格式化。它不應該只佈置一次嗎? – Rafael 2013-02-26 12:28:38

回答

2

我在你的描述中看到兩個問題。首先,你這樣說:

在這個VC我編程調整滾動視圖內的UILabel的框架。這是在viewDidLoad上完成的。

它通常是一個壞主意,修改viewDidLoad視角畫面,因爲該系統的佈局階段(在此期間layoutSubviews消息發送)還沒有發生。在viewDidLoad中,您的視圖的框架尚未針對當前設備的屏幕大小和界面方向進行調整。

其次,你說你正在使用自動佈局。自動佈局系統在佈局階段設置視圖幀。佈局階段可以由許多不同的事件觸發,包括(如你所發現的)視圖的出現和消失。

爲了對標籤的框架進行調整,您需要修改控制標籤框架的約束條件。一種方法是在視圖控制器上爲每個需要修改的約束創建一個類型爲NSLayoutConstraint的插座,並將這些插座連接到xib中的約束。然後在您的視圖控制器的viewWillLayoutSubviews中,您可以根據需要修改每個約束的constant屬性。 (具有諷刺意味的是,constantNSLayoutConstraint唯一可修改的屬性。)

+0

雖然這並沒有真正解決我的問題,但羅布的觀察發現並通過這些發現解決了我的問題。我不會分享我的解決方案,因爲它非常不尋常,但簡而言之,我最終以編程方式創建了控件,而不是使用autoLayout。 – Rafael 2013-02-27 01:47:16