2012-10-17 66 views
1

我有一個UIViewController,縱向配有iPad xib。當我的iPad處於橫向模式時,我將該視圖控制器放入我的UISplitViewController的詳細信息窗格中,它會自動調整大小以適合哪種方式。當縱向xib調整爲橫向時,需要更改UIScrollView contentSize

但是,當我在-viewDidLoad中配置我的視圖時,視圖的最終大小尚未處於橫向/大小。

當我已經在橫向加載UIViewController時,-didRotateFromInterfaceOrientation:方法和與它關聯的其他方法不會被調用,所以何時何地能夠正確設置滾動視圖的contentSize和它的內容?

我只希望我的滾動視圖垂直滾動,所以我想確保我的滾動視圖裏面內容查看重新適合於它在任何方向的視圖控制器的寬度。

不管我檢查的是什麼.frame或.bounds,是否在我的視圖,我的滾動視圖,甚至是我的SplitViewController的詳細視圖控制器都顯示了我的實際大小。在橫向使用UISplitViewController時,左側寬度爲320px,這意味着右側不應超過704px寬,但每當我檢查幀和邊界以及我的視圖和滾動視圖邊界時,它們報告爲768px寬這是不正確的。

我的滾動視圖清晰只有704px寬,因爲我可以正確看到滾動指示。

我錯過了什麼?

這是我在-viewDidLoad代碼......所有的

CGSize textSize = [self.purchase.textDescription sizeWithFont:self.labelTextDescription.font constrainedToSize:allowedSize lineBreakMode:UILineBreakModeWordWrap]; 

CGRect textFrame = self.labelTextDescription.frame; 
textFrame.size.height = textSize.height; 
self.labelTextDescription.frame = textFrame; 

CGRect contentFrame = self.contentView.frame; 
contentFrame.size.height += textSize.height; 

if (contentFrame.size.width > self.scrollView.frame.size.width) { 
    contentFrame.size.width = self.scrollView.frame.size.width; 
} 

self.contentView.frame = contentFrame; 

[self.scrollView addSubview:self.contentView]; 
self.scrollView.contentSize = self.contentView.frame.size; 
+0

你能發佈你設置內容大小的代碼嗎?它在viewDidLoad中嗎? – atxe

+0

是的,在viewDidLoad中我添加了代碼。 –

+0

旋轉時,您的UIScrollView的內容大小真的在變化嗎?內容是不是相同和相同的大小? – atxe

回答

5

適當的時間來佈置你的意見,並設置滾動視圖的contentSize是在運行循環的佈局階段。在此階段,UIKit將layoutSubviews消息發送到已標記爲需要佈局且位於窗口中的任何視圖。當發生各種事情時,視圖會自動標記爲需要佈局,包括何時首先將其添加到窗口層次結構,何時給予新的子視圖以及何時更改其大小。您也可以手動將視圖標記爲需要佈局,方法是發送setNeedsLayout消息。

由視圖接收layoutSubviews消息的時間,UIKit中已經發送layoutSubviews到任何一個需要它的視圖的祖先(它的父及以上),並且它已經有其框架來調整是根據它的自動尺寸調整掩模或自動佈局約束和它自己的子視圖的框架已經根據它們的自動調整掩碼或自動佈局約束進行了調整。

如果self.view已經是UIView的自定義子類,則最好的方法是簡單地覆蓋該類中的layoutSubviews。將佈局代碼放在那裏,並在那裏設置滾動視圖的contentSize

如果你不使用自定義的子類,你不希望創建一個,那麼你可以做你的視圖控制器的viewWillLayoutSubviewsviewDidLayoutSubviews方法的佈局,如果你部署目標是安裝iOS 5.0或更高版本。您可能猜測這些消息何時發送。 :)

在自轉,所有這些消息(layoutSubviewsviewWillLayoutSubviewsviewDidLayoutSubviews)都在自轉的動畫塊內發送,所以如果你在這些方法中的一個做你的佈局,您還可以獲得利益的變化您的佈局將在自動旋轉動畫過程中進行動畫製作。

+0

-viewDidLayoutSubviews聽起來很完美,但我需要支持回到iOS4.3。任何建議iOS4?我沒有使用任何自定義視圖。 –

+0

我會做一個'UIView'的子類並實現'layoutSubviews'。 –

+0

必須有一種方法可以確定我的視圖控制器的實際大小,儘管... –

0

首先,如果你不想讓旋轉檢查自動調整大小面具調整時的觀點。如果建在界面生成器視圖然後檢查它不改變它的大小時,上海華做:

Sizing properties of a view

您可以self.interfaceOrientation檢查UIViewController當前界面的方向。如果您想設置您手動查看,這可能會對您有所幫助。

此外,如果您需要手動調整大小,然後前(或後)設置所需的幀你的意見被旋轉:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 
0

我會建議查詢狀態欄方向來獲得當前旋轉viewDidLoad我會建議不要依靠自動調整大小的滾動視圖,因爲它往往變得棘手。根據該比例檢查狀態欄的比例調整大小。

[UIApplication sharedApplication].statusBarOrientation

相關問題