我已經投了由@slycrel答案使用情況下(尤其是多任務處理)的好成績,但我想花時間寫這篇文章,並指出一些似乎在這個老問題上丟失的東西,以及關於這個問題的許多其他問題。
的確,蘋果公司並不真的希望我們根據方向變化更新我們的大部分用戶界面,但它仍然是完全可能的,有時還需要在個案情況下,並且這種方式會一直持續到蘋果公司改進它們新的(ISH)的API(如viewWillTransitionToFrame:
會方式更加有用比viewWillTransitionToSize:
。只是說)
爲什麼我投了由@slycrel答案是關係到你需要牢記的之間的邏輯有什麼區別UIDeviceOrientation
和UIInterfaceOrientation
。
狀態欄表示應用程序當前已知的UIInterfaceOrientation
。所有關於FaceUp
,FaceDown
的內容僅與設備的方向有關,不一定是您的應用程序的方向。 無論如何,應用程序不支持設備方向。真的,UIDeviceOrientation
可以完全忽略,如果你所要做的只是確保你的界面佈局和動畫適當,這是99%的應用程序開發人員的用例。這是目前從@ slycrel狀態欄UIInterfaceOrientation
的答案來實現的:
[UIApplication sharedApplication].statusBarOrientation
應該指出,在讀寫版本屬性已被棄用,在只讀版本是沒有的。
藉此例如:
- 我具有支持所有接口取向的應用程序,並支持它們,以及一個根視圖控制器。
- 現在,我將介紹一個
UIViewController
,這將導致狀態欄方向變爲橫向。
- 它的風景方向(左或右)取決於該視圖控制器的
preferredInterfaceOrientationForPresentation
返回的內容,當前設備的方向以及視圖控制器支持的接口方向(請參閱下一點)。
- 無論當前設備方向是什麼,狀態欄都會轉到橫向,因爲此視圖控制器僅基於由
supportedInterfaceOrientations
返回的內容支持橫向。假設我們支持UIInterfaceOrientationMaskLandscape
這兩個橫向左右。
- 我還希望通過旋轉變換有條件地將此視圖控制器設置到位。這隻在從肖像或肖像倒轉到左側風景或右側風景時纔有必要。否則,這將是一個更簡單的演示動畫,無需旋轉。
- 然後,經過一段時間和設備使用,我解僱了視圖控制器。
- 現在我想有條件地使用另一個旋轉變換使此視圖控制器脫離屏幕。這隻在從左側風景或右側風景轉到縱向或縱向時纔有必要。否則,這將是一個更簡單的解僱動畫,不旋轉。
- 此時,根據您的根視圖控制器的首選接口方向和支持的接口方向以及設備當前的
UIDeviceOrientation
,系統決定的狀態欄方向將變爲適當的值。
- 因爲我們是要在視圖控制器支持所有接口的方向,如果你的設備的方向朝上或面朝下,你不能可靠地估計基於
UIDeviceOrientation
下一個UIInterfaceOrientation
,你不必反正。
- 所以...狀態欄方向救援!
前面的例子是可能的,因爲當視圖控制器轉換即將開始時(系統詢問動畫師的轉換委託等),狀態欄方向不會更新。然後在轉換開始動畫時更新(例如,調用animationTransition:
時)。這樣,只需使用狀態欄UIInterfaceOrientation
的初始值和當前值即可進行比較。
即使不使用視圖控制器轉換,基於狀態欄方向更新視圖仍應該是安全的。
記住,如果你是手動更新狀態欄,如果你是不是在你的Info.plist中使用「查看基於控制器的狀態欄外觀」,那麼你的應用程序的邏輯必須意識到當狀態酒吧將會改變方向。你可能會尋找一對夫婦NSNotification
名字對於這些情況,它們是:
UIApplicationWillChangeStatusBarOrientationNotification
UIApplicationDidChangeStatusBarOrientationNotification
除了這些UIApplicationDelegate
方法:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
這其他有幫助UIApplication
財產:
@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;
您的回答非常有幫助。現在,我必須測試的是isPortrait是否爲true,而不是嘗試將定向代碼添加到viewController旋轉方法中 – Justin 2010-04-10 20:06:34
請注意,這似乎並不總是奏效。特別是如果你的控制器是你的應用中的第一個。在我的模擬器測試中[self interfaceOrientation]總是返回爲1.也許它在實際設備上有所不同..至少......很難測試。 – 2010-04-15 02:08:47
我相信當應用第一次啓動時,默認方向是縱向。這可能可以解釋爲什麼[self interfaceOrientation]總是返回1. – 2010-06-03 07:53:42