2012-04-12 57 views
1

我有一個UITabBar 5個選項卡。我只希望爲一個UIViewController啓用自動旋轉功能,這個UIViewController被深入到選項卡#3的深處。所以要清楚:點擊UITabBar項目3,並獲得不應該自動旋轉的標籤欄項目#3的根UIView。點擊並獲取另一個UIViewController壓入堆棧(通過UINavigationController)。再次點擊,並將另一個UIViewController推入堆棧。只有在這裏應該這個UIView autorotate。只能自動旋轉UITabBar中的一些選項卡? (iOS 5)

其他4個選項卡根本不應旋轉 - 不是選項卡的根視圖,也不是選項卡的任何子視圖。

有人能告訴我我應該使用什麼方法嗎?我讀過每一個標籤都需要對willAutorotateToInterfaceOrientation作出回答「是」。

+0

檢查此http://stackoverflow.com/questions/2731136/view-controllers-inside-tab-bar-controller-not-auto-resizing-on-rotation – mChopsey 2012-04-12 16:03:49

回答

2

在每個視圖的shouldAutorotate...中,您可以在根視圖控制器中調用一個方法來檢查當前正在顯示的內容。如果顯示選項卡3的深層視圖,它將返回YES,否則返回NO,視圖將返回相同。


編輯 - 每user798719的要求更詳細地:

你的根視圖控制器知道哪些視圖在顯示。您將一種方法添加到根視圖控制器- (BOOL) isDeepLevelTab3Displayed;。該方法檢查是否顯示選項卡3的深層視圖,如果是,則返回YES,否則返回NO。

每個子視圖控制器的shouldAutorotate…方法將得到一個裁判根控制器,以便它可以調用isDeepLevelTab3Displayed.

如果您使用的是導航式控制器,可以得到這樣的裁判(self是子控制器):

NSArray *arrayOfControllers = [self viewControllers]; 
UIViewController *rootController = [arrayOfControllers objectAtIndex:0]; // per UIViewController class ref, root controller is at index 0 

或者你可以得到什麼你的項目是這樣的:

YourProjectAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
UIViewController *rootController = appDelegate.rootController; // or appDelegate.intermediateClass1.intermClass2.rootController — however you set up your project 

所以每個子控制器這樣做:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    UIViewController *rootController = [[self viewControllers] objectAtIndex:0]; 
    return [rootController isDeepLevelTab3Displayed]; 
} 

因此,子控制器將返回YES自轉時應該發生,滿足你提到你的問題的最終要求。

但是,如果您的所有子控制器都是UINavigationController的實例,則可以通過調用visibleViewController直接確定當前正在顯示哪個視圖。那麼你只需要一種檢查其身份的方法。

你可以檢查控制器的nibNametitle,例如,對一個常數或整數屬性intControllerIdentity在控制器的initWithNibName… 整數屬性的方案是最好的添加到您的所有控制器和設置這些參數,因爲它贏得了如果您稍後更改nibName或標題,則不會受到影響。

你會添加常數一些類,其.h文件是由所有的控制器(或者,如果所有的控制器都是一樣的類的實例,擺在那類的.h文件這些常量)進口:

#define kFooController 1 
#define kBarController 2 
#define kRotatableController 3 

而且你會設置這樣的:

self.intControllerIdentity = kRotatableController; 

,並檢查它是這樣的:

if (self.intControllerIdentity == kRotatableController) 

希望有所幫助。 但用評論眼睛評估這個增加的細節;我曾與自動旋轉,但尚未與導航控制器。

+0

+1有效選項 – Till 2012-04-12 16:01:41

+0

嗨,謝謝你的幫幫我。你是否介意爲我解釋一下你的解釋?我仍然有點不清楚。 – user798719 2012-04-12 16:35:57

+0

當然。我編輯了答案以添加更多細節。 – Wienke 2012-04-12 18:26:49