2014-02-28 20 views
1

得到設備的方向我有一個取決於方向顯示不同圖像的應用程序......我一直在使用:IOS,如何在啓動或viewDidAppear

UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]); 

要看看它是否是景觀還是不行。 ..但如果我在我的rootViewController中調用這個:viewDidLoad,viewWillAppearviewDidAppear它總是假....然後我試圖通過比較具有autosizeMask的幀的寬度和高度來判斷它的landsCape或no,因此它總是全屏...其滾動視圖和我做以下事情:

BOOL landscape = self.frame.size.width>self.frame.size.height; 

但是這也不起作用(總是爲假),因爲該視圖仍然具有當時肖像視圖的框架。

回答

3

而不是使用設備方向,檢查接口方向。這些宏將幫助你。

#define IS_PORTRAIT  UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]) 
#define IS_LANDSCAPE UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) 
+0

這些在啓動時無法正確工作。這是因爲在statusBarOrientation設置正確之前會有一些延遲。我認爲這是一種安全機制,用於「強制」我們創建肖像視圖或使用像我之前在應用程序中使用過的工作。 – daveMac

+0

謝謝...我完全忘了statusBarOrientation – user2387149

2

你應該在viewWillLayoutSubviews做你的佈局。那時你的視圖控制器的視圖frame將被正確設置。

使用orientation屬性是錯誤的。從文檔:

該屬性的值是一個常數,指示設備的當前方向。該值表示設備的物理方向,可能與應用程序用戶界面的當前方向不同。

取而代之,您可能需要使用[UIApplication sharedApplication].statusBarOrientation,這將在大多數情況下與您的用戶界面方向相匹配。

2

你可以做的是創建一個通知,然後做相應的工作!

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:)  name:UIDeviceOrientationDidChangeNotification object:nil]; 

嘗試使用這個藏漢

[UIApplication sharedApplication].statusBarOrientation 

回報人像時,它的景觀,景觀時,它的肖像在推出後,在iPad上

+0

[UIApplication sharedApplication] .statusBarOrientation在應用程序首次啓動時不會返回正確的值。看到我的答案。 – daveMac

2

我有一個應用程序,發射方向是至關重要的,我知道。我很沮喪地得知蘋果的官方立場是你應該用肖像創造你的觀點。從文檔的UIViewController

在啓動時,應用程序應該始終設立在 縱向接口。 應用程序:didFinishLaunchingWithOptions:方法返回後,應用程序 使用上述視圖控制器旋轉機制將 視圖旋轉到顯示窗口之前的適當方向。

您可以按照惡劣的建議,但它不會工作......你倒不怎麼需要它反正。之所以這樣,是因爲在應用程序啓動後第二次左右沒有生成正確的方向通知。我認爲亞倫的建議使用viewWillLayoutSubviews可能值得研究。

在我上面提到的我的應用程序中,我沒有加載視圖,直到我得到第一個合法的設備方向通知。相反,我只是展示了發射圖像,直到我知道設置視圖的方向。

相關問題