2012-06-11 39 views
4

我需要根據方向更改View的圖像背景。對於這一點,我使用viewWillAppear的statusBarOrientation方法:statusBarOrientation在viewWillAppear上的錯誤值

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    if (UIInterfaceOrientationIsPortrait(currentOrientation)) { 
     NSLog(@"PORTRAIT"); 
    } else if (UIInterfaceOrientationIsLandscape(currentOrientation)) { 
     NSLog(@"LANDSCAPE"); 
    } 
} 

的問題是,控制檯總是顯示人像,甚至當iPad在橫向模式舉行。 viewDidAppear中的代碼正常工作,但已經太晚了,用戶可以看到圖像的更改。這讓我認爲statusBarOrientation的正確狀態在viewWillAppear中仍然不可用,但我已經閱讀過其他一些問題,這些代碼應該在那裏工作。

+0

什麼更奇怪的是,在viewWillTransitionToSize:你可以查詢方向,如果你旋轉手機兩次(回到它的viewDidLoad位置),statusBarOrientation會給你正確的答案。儘管它在viewDidLoad中給出了不同的答案,現在該設備與當時的方向相同! –

回答

12

嘗試

int type = [[UIDevice currentDevice] orientation]; 
    if (type == 1) { 
     NSLog(@"portrait default"); 
    }else if(type ==2){ 
     NSLog(@"portrait upside"); 
    }else if(type ==3){ 
     NSLog(@"Landscape right"); 
    }else if(type ==4){ 
     NSLog(@"Landscape left"); 
    } 
+1

好吧,有趣......我到處看到,狀態欄方向的方法比UIDevice更可靠,但這就像一個魅力!謝謝! –

+0

不客氣 –

+1

我搜索無處不在... interfaceOrientation,statusBar都返回錯誤的方向,然後這個解決方案工作+1 .. – iMeMyself

3

你不應該使用statusBarOrientation來確定應用程序的當前方位。根據Apple的文檔:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

此屬性的值是一個常數,指示接收方的狀態欄的方向。有關詳細信息,請參閱UIInterfaceOrientation。設置此屬性可將狀態欄旋轉到指定的方向,而無需爲過渡設置動畫。但是,如果您的應用程序具有可旋轉的窗口內容,則不應該使用此方法任意設置狀態欄方向。如果設備更改方向,則通過此方法設置的狀態欄方向不會更改。

嘗試使用一個UIViewController的interfaceOrientation屬性來獲取當前應用的方向。

+1

我用這種方法,因爲它在幾個答案在這裏在Stackoverflow推薦獲取方向。使用[[UIDevice currentDevice]方向]方式工作。讀取屬性interfaceOrientation也起作用。 –

+0

Apple文檔的鏈接並沒有說你不應該使用它來確定當前的方向。你能否給我們一個參考資料來源,說明你爲什麼不應該?實際上,Apple的示例代碼使用它:https://developer.apple.com/library/content/samplecode/AVCam/Listings/Swift_AVCam_CameraViewController_swift.html#//apple_ref/doc/uid/DTS40010112-Swift_AVCam_CameraViewController_swift-DontLinkElementID_15 Cmd-F for statusbarOrientation。事實上,UIDevice的方向警告說它可能與你的UI的方向不同,所以根據文檔判斷,應該避免它。 –

+0

這給一些設備帶來問題。謝謝蘋果。 – Warpzit

0

這裏是一個有用的代碼段用於記錄設備的interfaceOrientation:

NSArray* orientations = @[ @"nothing", @"UIInterfaceOrientationPortrait", @"UIInterfaceOrientationPortraitUpsideDown", @"UIInterfaceOrientationLandscapeLeft", @"UIInterfaceOrientationLandscapeRight」]; 
NSLog(@"Current orientation := %@", orientations[self.interfaceOrientation]); 

希望這有助於有人出來!

相關問題