我對自動旋轉做了一些實驗。 情況:我有一個TabBar 4(標籤),三個只應該是肖像。最後一個是UINavigationController,它本身不應該自動控制任何堆疊的控制器。它基本上是一個瀏覽應用程序,因爲我顯示的文件和文件夾的一切都應該是肖像。有時候會推送一個特殊的UIViewController,我只希望這個自動旋轉(它始終是堆棧中的最後一個)。在這最後一個視圖中,tabbar是隱藏的。UIControllers的選擇性自轉
如何實現的目標:我劃分子類的UITabBarController,覆蓋標準shouldAutorotate方法的行爲:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if([self.selectedViewController isKindOfClass:[UINavigationController class]])
return [[(UINavigationController*)self.selectedViewController visibleViewController] shouldAutorotateToInterfaceOrientation:interfaceOrientation];
else
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
這樣,shouldAutorotate的答案被轉發到控制選項卡,並特別針對的UINavigationController ,它又被委派給可見的UIViewController。基本上這是有效的,因爲我有所有的UIViewControllers回答NO,除了我上面描述的特定的一個:正確地,當旋轉模擬器時,只有當特殊的UIViewController可見時,界面旋轉到風景,這是完美的。這裏的Tabbar是隱藏的,所以用戶不會得到那個也是旋轉的(這在我的設計中是不一致的:基本上只要Tabbar是可見的,除了在這個特殊的視圖中,除了這個特殊的視圖外,應用程序只是肖像)。
問題是,即使設備仍然處於橫向模式並且用戶彈出特殊的ViewController,該接口應該表現得一致並返回到縱向模式。相反,當我彈出時,界面停留在橫向(它不是那樣設計的,所以它是一團糟,當然),即使當顯示一個UIViewController會回答NO shouldAutorotate ...這是因爲(我認爲)該方法是隻有在發生旋轉時纔會調用,所以直到旋轉實際上再次發生時,界面才旋轉到橫向。
如何避免這種情況?我的第一個解決方案是以某種方式攔截最後一個視圖的彈出,並在彈出之前手動旋轉視圖...但我不確定,我希望有一些更強大的方法來處理!
我用模擬器3.0,不知道如果這有所作爲。
長話短說,你問是否有辦法讓環境重新評估'shouldAutorotate..'方法時,從視圖控制器彈出堆棧? – falstro 2009-11-23 10:12:07
實際上,我只是希望用戶總是在縱向模式下在導航堆棧上看到n-1個UIViewControllers,即使他在橫向模式下(最後一個視圖允許)彈出最後一個。 如果在花園視圖彈出時重新評估shouldAutorotate會導致自動旋轉回肖像,那麼回答爲是 – Andy 2009-11-23 11:42:59