2010-01-22 51 views
5

我注意到,我的設備&模擬器上出現非常間歇性的方向。設備和模擬器上的非​​常間歇性的方向

我有一個模式的視圖控制器,我介紹,這是我的應用程序中唯一支持旋轉的東西。

如果我在不移動設備的情況下以縱向方式啓動應用程序,請打開模式VC,然後旋轉設備,它通常工作。但是,有時如果我打開橫向保持設備的應用程序,然後旋轉至縱向,啓動VC並旋轉設備,則不會發生旋轉。看起來非常間歇。有時,如果我以縱向模式啓動應用程序,然後打開VC並旋轉設備,則不會發生任何事情,直到我退出並重新啓動應用程序時,纔會出現方向。

這很奇怪,因爲它有50%的工作時間!每當我通過Xcode啓動它並在shouldAutorotateToInterfaceOrientation中設置斷點時,它總是有效!

任何人有過這樣的事情或知道發生了什麼?

+0

沒有具體的想法什麼是錯的,但我想我會問在UI中發生了什麼奇怪的事情時我總是問自己:「你在UIKit之外的主線程中調用了什麼?」 – lawrence 2010-02-03 08:35:01

+0

感謝您的評論。不,我確定我沒有這樣做!這一切都非常令人費解。 – 2010-03-30 08:18:47

+0

此行爲僅在您的應用中發生,還是您在其他應用中看到它行爲異常? – Jasarien 2010-03-30 14:08:08

回答

-1

即使您嘗試在橫向上啓動您的應用程序,您的手機將以縱向啓動它,然後根據手機在哪個位置進入橫向。

我不知道你用什麼代碼來完成這個。以下是從Apple代碼片段中獲取的一個代碼片段。看看這是否有幫助。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) 
interfaceOrientation duration:(NSTimeInterval)duration {  
    if (interfaceOrientation == UIInterfaceOrientationPortrait) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     self.view = self.portrait; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     self.view = self.landscape; 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = 
     CGAffineTransformMakeRotation(degreesToRadian(90)); 
     self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
} 
+0

感謝您的回答。這似乎是兩個單獨的縱向和橫向視圖之間交換的代碼。我只是簡單地允許旋轉單個視圖,純粹通過在shouldAutorotateToInterfaceOrientation方法中返回YES。 – 2010-04-02 15:00:07

0

我有過類似的挑戰越來越自轉正確的視圖控制器的父視圖控制器不自轉工作,雖然大部分的我的經驗與扯皮的UINavigationController,而不是模態的視圖控制器。不過,我會建議您嘗試以下操作:

  1. 調用presentModalViewController:在您的層次結構中的頂級視圖控制器,而不是更深的viewController上。

  2. 如果不解決這個問題,嘗試繼承您的頂級視圖控制器,並覆蓋其shouldAutorotateToInterfaceOrientation:看起來是這樣的:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    if (self.modalViewController) { 
     return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    } 
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 
1

既然你提到的「間歇」,我會說這跟輪換之後你在做什麼有關。

爲了找到這個錯誤,我建議在旋轉發生後刪除任何代碼。註釋掉任何網絡活動或OpenGL操作。也可以幫助關閉XCode並重新打開它。

如果沒有什麼幫助,我會做一個新的項目,並開始逐個移動文件和測試。

+0

是的,我絕對認爲奇怪的事情正在發生。我打算剝離代碼,直到它正在工作並解析它。感謝您的建議。 – 2010-05-06 19:30:05

0

是否調用

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

當你告訴你的旋轉感知查看幫助? (並可能在關閉它時再次關閉它)

我會尋找的另一件事是可疑的電話[UIWindow makeKeyWindow][UIResponder becomeFirstResponder]

我還會註冊UIDeviceOrientationDidChangeNotification事件,並確保Modal視圖對您收到的每個事件調用[UIViewController shouldAutorotateToInterfaceOrientation:]

+0

感謝您的幫助。我會嘗試這些建議並回復你! – 2010-05-06 19:30:49

0

我終於發現了什麼問題!

事實證明,只有你添加到你的UIWindow的第一個UIView會被詢問是否要旋轉。任何後續視圖都不會收到此消息。我的應用程序正在使用另一個視圖來遠離啓動時顯示的Default.png進行動畫製作,並且首先將其添加到窗口中!

相關問題