0

我有一個孩子UIViewController與這是UITabBarControllerUINavigationBarController層次結構的一部分。我們稱之爲ChildViewController;然後我的層次結構是這樣的:僅支持層次結構中的子UIViewController的旋轉?

UITabBarController 
    | 
    UINavigationViewController [tab 1] 
    | 
    SomeParentViewController 
     | 
     SomeOtherParentViewController 
     | 
     ChildViewController 

現在我只想ChildViewController支持旋轉爲橫向。 (這是一個顯示聊天視圖的視圖控制器,對於某些人來說,橫向模式更容易打字。)我添加了方法- (BOOL) shouldAutorotateToInterfaceOrientation:ChildViewController來聲明它支持橫向,但旋轉設備沒有效果。從調試中,我發現– willAnimateRotationToInterfaceOrientation:duration:沒有被調用。

經過在線搜索,我發現UITabBarController的後代只支持給定的方向,如果UITabBarController本身支持該方向。而奇怪的是,UITabBarController只支持一個方向,如果每個標籤的視圖控制器支持旋轉。與上面的選項卡1類似,其他三個選項卡的視圖控制器爲UINavigationViewController實例;而且,因爲我們必須更深入,所以每個UINavigationViewController只支持其子視圖控制器支持方向的方向。

所以在這一點上,添加- (BOOL) shouldAutorotateToInterfaceOrientation:添加到SomeParentViewController和其他UINavigationController實例的子項允許ChildViewController旋轉。但現在SomeParentViewController和其他三個標籤將旋轉到風景,並且它看起來很可怕。我只希望ChildViewController支持景觀。

作爲鎖溝工作,我創建了自己的UITabBarController子類,名爲RotatingUITabBarController,並向ChildViewController類添加了一個全局標誌,讓我知道它是否已創建並顯示。該RotatingUITabBarController只覆蓋- (BOOL) shouldAutorotateToInterfaceOrientation:,併爲實現:

if ([ChildViewController isDisplayed]) { 
    return ((toInterfaceOrientation == UIInterfaceOrientationPortrait) || 
     (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) || 
     (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)); 
} 
return NO; 

現在,如果我啓動應用程序,切換到SomeParentViewController或任何其他選項卡,然後旋轉手機不能切換到風景模式,肖像中而不是保持。到現在爲止還挺好。如果我創建並顯示ChildViewController並旋轉手機,它將進入風景。到現在爲止還挺好。但現在如果我彈出ChildViewController來揭示SomeOtherParentViewController,它也是在風景。 SomeParentViewController以及我切換到的每個其他選項卡也是如此。

我現在沒有技巧了。任何意見將不勝感激,謝謝!

回答

1

也許你喜歡的這種行爲的最佳模式是YouTube應用。大多數界面僅限肖像,但播放視頻的視圖可以在人像或風景中使用。

如果你看看那個應用程序,你會注意到UI的整個標籤部分實際上是一個模態視圖控制器。當你啓動應用程序時,標籤欄控制器立即以模態方式呈現。您離開模式標籤欄控制器的唯一時間是您播放視頻時 - 您會注意到整個標籤界面向下滑動以顯示視頻視圖。當視頻結束時,標籤欄控制器再次以模態方式呈現。

這是一種「正常」方式的反轉,其中僅使用模式視圖控制器,但它在YouTube應用中運行得非常好。它可能也可能不適合你。重要的是讓您的應用程序具有可預測性和流暢性,並始終讓用戶感受到控制權。