2009-11-23 34 views
3

我對自動旋轉做了一些實驗。 情況:我有一個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,不知道如果這有所作爲。

+0

長話短說,你問是否有辦法讓環境重新評估'shouldAutorotate..'方法時,從視圖控制器彈出堆棧? – falstro 2009-11-23 10:12:07

+0

實際上,我只是希望用戶總是在縱向模式下在導航堆棧上看到n-1個UIViewControllers,即使他在橫向模式下(最後一個視圖允許)彈出最後一個。 如果在花園視圖彈出時重新評估shouldAutorotate會導致自動旋轉回肖像,那麼回答爲是 – Andy 2009-11-23 11:42:59

回答

0

問題是,你正在旋轉你的UITabBarController(使用子視圖控制器),而不是僅僅是子視圖控制器。您應該能夠在您的子視圖控制器中實現shouldAutorotateToInterfaceOrientation:只有並使其正常工作。它也會簡化你的代碼。

我從來沒有遇到過這個問題,但我從未在「容器」視圖控制器中使用shouldAutorotateToInterfaceOrientation:,如UITabBarControllerUINavigationController

+2

是的你是對的......但是當我試圖僅在子視圖控制器中設置自動旋轉時,但似乎這不起作用。我只在最後一個視圖控制器中開始重寫shouldAutorotate ...沒有任何操作::調用shouldAutorotate(我使用NSLogs來查看),但willRotate從不調用。然後我擴展到所有堆疊視圖控制器,但沒有再次。然後我subclassed UINavigationController本身允許自動旋轉,但沒有...只有當我subclassed TabBar允許自轉,一切開始旋轉。 – Andy 2009-11-25 15:32:50

+0

奇怪:/。如果您有時間,可以撰寫一份最低限度的重複案例,並將其作爲錯誤報告提交給Apple。 – 2009-11-25 17:22:48

1

我知道這不是您的問題的解決方案,但我認爲您應該真正避免這種類型的用戶界面,當縱向肖像+橫向或橫向頁面混合在相同的UINavigationController。不幸的是,輪換管理是非常麻煩的,並且錯誤在不同的固件版本上有所不同。

我在我的一個項目中設法完全一樣,但由於固件錯誤而必須稍後將其刪除:例如,如果在橫向模式下按下「後退」按鈕並返回到僅肖像視圖,經常發生狀態欄和/或導航欄保持橫向模式並且佈局被完全破壞。據我所知,這個bug雖然已經存在於固件2.x中,但還沒有解決。

如果您仍然想這樣做,我建議以下幾點:

  1. 確保所有重寫UIViewController的方法(INIT,viewWillAppear中,等)調用它的[超級方法名。如果不是,自動旋轉是無聲無息的。這是在「準備好iPhone OS 3.0技術說明」(https://developer.apple.com/iphone/checklist/)中提到的,但目前該文檔不可用:(

  2. 您可以嘗試在離開橫向視圖時調用未記錄的[UIDevice setOrientation:]方法有時需要調用兩次,一次是當前方向,一次是所需方向:)如果狀態欄保持橫向模式,您可能還需要調用[UIDevice setStatusBarOrientation:]。但請注意,如果您使用這些方法(他們前段時間推出了自動工具,可檢測應用程序中是否存在未公開的符號),Apple可能會拒絕您的應用程序。

0

你的實現的問題是你使用UINavigationController的visibleViewController成員。你應該使用topViewController來代替,一切都會按預期工作。

1

我有同樣的問題,因爲你,我解決了這個辦法: 我子類的UITabBarController,並添加以下代碼:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if (self.selectedViewController) 
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    else 
     return (interfaceOrientation == UIDeviceOrientationPortrait); 
} 

這樣,每個孩子視圖控制器可以控制自己的方向。