2012-12-06 56 views
1

我有我的應用程序一個奇怪的錯誤,當我的UI流程如下:iPad應用方向和重新定位的問題

  1. 的mainViewController爲縱向展開,反過來它會顯示一個LoginViewController與modalPresentationStyle集到UIModalPresentationFullScreen

  2. 我將loginViewController設置爲橫向模式,輸入登錄憑據(用於驗證用戶的方法在mainViewController中定義)。

  3. loginViewController被解除(從mainViewController),並且一堆按鈕被加載到屏幕上以指示它是主屏幕。

現在我的問題是,按鈕位置看起來好像是應用在縱向方向,即使該應用程序切換到風景而loginViewController提出。

不過,只有當modalPresentationStyle設置爲UIModalPresentationFullScreen時纔會發生這種情況!當我將它作爲表單或頁面表示時,一切正常(但我需要將我的loginViewController顯示爲FullScreen)。

到目前爲止,我已經試過在loginViewController被解僱等情況下手動調用shouldAutorotate方法,並且解決了問題,但似乎是一種粗劣的解決方法而不是解決方法。

我也試着從loginViewController調用mainViewController的shouldAutorotate方法,但是這並沒有改變。

關於如何解決該問題的任何想法?

+0

什麼IOS版本是你測試它? –

+0

我正在運行iOS 6. –

+0

我猜你錯過了一些簡單的東西。如果在登錄完成後以及設備已處於橫向模式時添加按鈕,則可能需要重新考慮用於按鈕的框架。爲什麼不在自身之前加載按鈕等,只是隱藏/取消隱藏它們,以便您可能不需要再次爲橫向模式計算框架?這是假設你的自動調整大小掩碼設置正確。 – Ravi

回答

1

自動旋轉已在iOS 6中更改。在iOS 6中,不推薦使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。在其位,你應該使用supportedInterfaceOrientations:shouldAutorotate方法:

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskAllButUpsideDown;  
} 

莫代爾ViewControllers在iOS 6中不再獲得旋轉來電:在willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:,和didRotateFromInterfaceOrientation:方法不再調用的任何視圖控制器,使一個上全屏演示 - 例如那些被稱爲:presentViewController:animated:completion:

This answer will further explain the rotation changes in iOS 6


[編輯] 完全不同的方式是提供一種用於旋轉的事件註冊。優點是所有對象都可以註冊,不僅UIViewController。這通常在視圖加載時完成,當視圖消失時停止(在此處放入dealloc)。在選擇的方法被調用時,方向改變(這裏是orientationChanged:):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Start generating device rotations and register for them 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

- (void)dealloc { 
    // Deregister and stop generating device rotations 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
    [super dealloc]; 
} 
+0

這很有趣。這部分回答了我的問題。那麼現在我該如何解決我的問題?我在另一個答案中注意到你說:「你可以讓顯示你的模態視圖控制器的視圖控制器通知它旋轉。」請你詳細說明一下嗎? 在我的應用程序中,它是未能旋轉的根viewController - 子viewController如何通知父級?我確實嘗試了'[self.parent shouldAutorotate];'並且它不起作用。 –

+1

我已經添加了自動旋轉到我的答案,因爲這是你在連接答案中提到的問題。您也可以通過註冊輪換更改事件來解決您的問題。 –

+0

謝謝,我會試試這個。 –

0
check this out.... may be this'll help... 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait |interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown| interfaceOrientation == UIInterfaceOrientationLandscapeLeft | interfaceOrientation == UIInterfaceOrientationLandscapeRight); 

} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown | UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; 
} 

- (BOOL) shouldAutorotate 
{ 
    return YES; 
} 
+0

這沒有幫助。除了'shouldAutorotateToInterfaceOrientation'從iOS 6開始已棄用,我已經嘗試過了。 –