1

我正在開發一個帶有TabBarController作爲rootcontroller的iphone應用程序。這個根控制器與導航控制器相關聯(每一個都與特定的選項卡欄按鈕相關)。TabBar應用程序是否需要shouldAutorotateToInterfaceOrientation在其所有viewControllers上返回YES?

一個對這些導航控制器展示了一些照片,因此我需要讓Lanscape這顯然沒有工作,直到我加入這個代碼,所有視圖控制器

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return YES; 
} 

然而,現在所有的方位在所有啓用意見的一些看法,我不想在景觀都出現了非常難看:(

不知道如何見好就收只在照片視圖景觀orienation並禁用所有其他的意見?

回答

3

考慮顯示UIViewController需要完全重定向功能。 這將是常見的,在我的愚見判斷正確的方式來處理這種情況。

要回答你的主題:是的,如果你想讓任何標籤式viewController允許重定向,它必須返回YES。對於您的UINavigationControllers的堆棧中的viewController也是如此。因此,對於這些組合也是如此。

從蘋果公司的技術說明在這個問題上:

爲什麼不會我的UIViewController旋轉與設備?

UITabBarController中的所有子視圖控制器或 UINavigationController不同意共同的方向集。若要 確保您的所有子視圖控制器正確旋轉,您必須爲每個視圖執行shouldAutorotateToInterfaceOrientation代表每個選項卡或導航級別的控制器。每個人必須同意 在相同的方向旋轉發生。也就是說,他們全部 應該爲相同的方向位置返回YES。

在使用模態呈現視圖控制器的情況下是沒有你的選擇 - 這裏來的另一種方式......

還有一種解決方案可能似乎有點「哈克」,而是在爲我工作過去。我會以非常非常「黑客」的方式起草它來簡化答案。

在shouldAutorotateToInterfaceOrientation內:toInterfaceOrientation實現所有viewControllers,返回一個全局值。根據當前顯示的viewController的需要更改該全局值。即使據說viewController只被詢問一次,這個常見的謠言已經被證明是不真實的。所以這裏是超級黑客;

您的導航堆棧中的所有視圖控制器應實現shouldAutorotate-方法是這樣的:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation 
{ 
    extern BOOL gSouldAutorotateToAnyOrientationFlag; 
    if (gShouldAutorotateToAnyOrientationFlag) 
    { 
     return YES; 
    } 
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation); 
} 

現在,在某處你的應用程序,還應當聲明並實例化全局標誌 - 你可以把這個醜陋的全局標誌您的應用程序,委託執行中,正下方的進口和@implementation塊以上:

BOOL gShouldAutorotateToAnyOrientationFlag = NO; 

內,都應該在肖像模式下只顯示所有viewControllers,設置該標誌對NO - 如。在viewWillAppear;

- (void)viewWillAppear:(BOOL)animated 
{ 
    extern BOOL gShouldAutorotateToAnyOrientationFlag; 
    gShouldAutorotateToAnyOrientationFlag = NO; 
} 

在本應該在任何方向被示出的的viewController/s時,設置向YES該標誌 - 再次內viewWillAppear中;

- (void)viewWillAppear:(BOOL)animated 
{ 
    extern BOOL gShouldAutorotateToAnyOrientationFlag; 
    gShouldAutorotateToAnyOrientationFlag = YES; 
} 

這樣,每當整個導航堆棧被要求其定向能力時,都會給出正確的答案。根據我的經驗,整個堆棧被反覆詢問,答案沒有被緩存,因此當我需要時,我的黑客工作。儘管如此,謠言似乎普遍存在,這些答案以某種方式被緩存,因此,在某些情況下,謠言可能是有效的 - 因此,如果這不適用於您(或者甚至是投下的投票:D),我將不負責任。

+0

在哪裏可以聲明這個全局變量(BOOL shouldAutorotateToAnyOrientationFlag) – Steve

+0

任何地方 - 例如在你的應用程序代表頂部(呃,我是否建議使用這個黑客應用代表?:D)。請注意,它不應該被聲明爲類實例變量,因此需要在類實現之外進行聲明。 – Till

+0

喜歡在.h文件的頂部? @interface聲明之前的某處? – Steve

-1

在視圖中, ONL Ÿ要對景觀:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation); 
} 

您可以UIInterfaceOrientationIsPortrait如果更適合您的需求更換UIInterfaceOrientationIsLandscape

+0

如果其中的任何內容都位於UITabBarController的任何UINavigationController的導航堆棧中,則無法工作。 (請注意,我沒有投票,因爲這個答案並非完全錯誤) – Till

相關問題