2015-04-02 83 views
0

我們的應用程序由Cocos3D和AR組成。由於升級到iOS 8,我們必須修復Apple定位處理,因爲蘋果給我們帶來了變化。iOS 8和UIScreen尺寸問題

但是,我們仍然遇到一些問題,導致我一個頗爲有趣的現象(我檢查它在我們的應用程序,並在一個全新的項目。):

記錄的[UIDevice currentDevice].orientation[UIApplication sharedApplication].statusBarOrientation[UIScreen mainScreen].bounds.size表明,當該裝置快速旋轉,設備的方向實際上改變,但接口的方向有時會保持不變,並導致屏幕邊界的計算錯誤......例如:

旋轉之前10

[UIDevice currentDevice].orientation = 1

[UIApplication sharedApplication].statusBarOrientation = 1

[UIScreen mainScreen].bounds.size = 414x736

第一次旋轉後:

[UIDevice currentDevice].orientation = 4

[UIApplication sharedApplication].statusBarOrientation = 4

[UIScreen mainScreen].bounds.size = 736x414

2旋轉後:

[UIDevice currentDevice].orientation = 1

[UIApplication sharedApplication].statusBarOrientation = 4

[UIScreen mainScreen].bounds.size = 736x414

現在很明顯,第二旋轉後,該設備是早在肖像模式 - 也沒有根據界面方向和屏幕邊界...

我在這裏錯過了什麼嗎?

+0

你在哪裏登錄結果?我的意思是你用哪種方法調用NSLog。 – LoVo 2015-04-02 07:33:56

+0

爲'UIDeviceOrientationDidChangeNotification'添加了一個觀察者,導致一個名爲'orientationDidChange'的方法(我的方法) – GalSab 2015-04-02 07:38:04

+0

UIDeviceOrientation並不總是UIInterfaceOrientation。例如,當您的設備在普通桌面上時,您可能會收到意外的值。 – LoVo 2015-04-02 07:41:23

回答

1

我在過去曾遇到過這個問題,並得出結論,當您將觀察者設置爲UIDeviceOrientationDidChangeNotification時,您指定的方法會在所有屬性更改以反映新方向之前調用。我處理的方式是創建一個延遲之後運行的代碼塊的函數然後調用:

- (void)deviceOrientationDidChange:(NSNotification *)note 
{ 
    RHRunBlockAfterDelay(0.5, ^{ 
     // Execute relevant code... 
    }); 
} 

延遲函數是在一個單獨的Functions.h定義爲[self performSelector:@selector(mySel) afterDelay:delay withObject:block];調用的包裝。

+0

您,先生,釘牢它。非常感謝你。現在我能找到的最短延遲是0.25。仍然顯而易見的壽,但它做到了這一點。 – GalSab 2015-04-03 11:52:47