2010-07-09 99 views
7

我的iPhone應用程序在支持方向更改時在iPad上運行時顯示一些奇怪的行爲。iPad方向更改問題

應用程序以視圖控制器(爲了參數調用視圖A)和導航控制器啓動,並且shouldAutorotateToInterfaceOrientation僅爲縱向返回YES。在導航控制器上,我推動一個視圖控制器(視圖B),該視圖控制器也僅爲縱向返回YES。然後,我將另一個視圖控制器(視圖C)推到支持所有旋轉的導航控制器上,並根據要旋轉的方向調整屏幕上的項目。

在iPhone模擬器和設備上運行此操作時,如果旋轉到視圖C上的橫向,然後點擊後退按鈕以返回到視圖B,則它執行正確的操作並將視圖B切換回縱向模式。 (在模擬器中,它甚至將模擬器自動旋轉回人像。)

我遇到的問題是,當我在iPad模擬器和設備上執行完全相同的事件序列時,出現的視圖B不旋轉回肖像,導航控制器仍然顯示視圖C的信息。然後,我點擊後退按鈕,視圖保持不變,但導航控制器對視圖B顯示正常(但全部仍處於橫向模式) 。然後,如果我再次點擊後退按鈕,視圖A會出現在視圖B導航欄項目下方,並最終再次點擊回到我的視圖A並顯示導航欄A項目。

如果我在iPad上查看B並開始旋轉,shouldAutorotateToInterfaceOrientation會觸發NO,直到我到達肖像模式,然後全部恢復正常。

該應用程序使用iPhone SDK的最新發布版本構建,並具有以下構建設置:iPhone Simulator 4.0的基本SDK,iPhone的目標設備系列,iPhone OS 3.1.3的iPhone操作系統部署目標。

任何想法?

+0

我在這裏有完全相同的問題,我相信這是iOS3.2中的一個錯誤。在我的iPhone(3.1.2和4.0)上應有的一切。 可悲的是,沒有(記錄)功能來手動改變方向。 讓我們看看別人在這裏要說些什麼... – cocoapriest 2010-07-10 18:40:26

回答

4

蘋果指出:

Case: All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set.

Response: To make sure that all your child view controllers rotate correctly, you must implement shouldAutorotateToInterfaceOrientation for each view controller representing each tab or navigation level. Each must agree on the same orientation for that rotate to occur. That is, they all should return YES for the same orientation positions.

http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

您可以在導航控制器內,而不是單獨視圖中設置設備的方向。然後,您可以檢查堆棧中的哪個視圖,並根據結果進行旋轉。這樣,導航控制器也處理所有方向。

+0

這不是問題。請仔細閱讀這個問題。 iPhone和iPad之間有一個真正的區別,他們是如何處理這個問題的...... – cocoapriest 2010-07-13 21:29:16

+0

我明白這個問題,我只是傳遞了蘋果的指導:)如果你覺得它是一個模擬器中的錯誤,你應該向蘋果公司關於它。很多人使用導航控制器進行定向,但是我似乎無法找到有關此類問題的其他人的任何信息,即使3.2已經出現很長一段時間了。 – iwasrobbed 2010-07-13 23:04:30

+2

我認爲這適用於您的情況。您的視圖C支持所有方向,而A和B僅支持肖像。 Apple的QA1688表示,在UINavigationController下的所有子視圖控制器必須同意一組註釋方向。我在[這個問題](http://stackoverflow.com/questions/3086684)有同樣的問題(vc沒有同意方向)。 – progrmr 2010-07-16 12:24:50

0

下面是一些代碼我使用,以防止錯誤:

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(M_PI/2); 
     self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
    } 
    [UIView commitAnimations]; 
} 

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(-(M_PI/2)); 
     self.view.bounds = CGRectMake(0, 0, 320, 480);; 
    } 
    [UIView commitAnimations]; 
} 

基於設備是在什麼方向,你將需要修改一些代碼。

+0

爲什麼設置變換兩次? – progrmr 2010-07-16 12:27:20

+0

第一個設置轉換類型(標識),第二個轉換。 另外shouldAutoRotateToInterfaceOrientation說,如果設備在該方向旋轉。如果設備處於橫向模式,那麼除非縱向顯示,否則界面不會旋轉。我提交的代碼是針對iPhone(320和480)的,但如果設備的方向是lanscape,則視圖看起來像是以縱向顯示,使用戶將設備傾斜以將其設置爲縱向(反之亦然)。 – 2010-07-16 16:11:53

+0

我同意progrmr:你不應該需要分配轉換屬性兩次。因爲你沒有做任何事情,所以第一項任務將被忽略。 'CGAffineTransformMakeRotation'不會返回任何內容,而只是旋轉,意味着帶有旋轉的身份變形。 – 2011-02-27 21:55:06