2014-01-13 43 views
3

因此,我有一個項目,當用戶按下按鈕時需要強制進行方向更改。我創建了一個sample app on github來演示這個問題。編程接口方向更改不適用於iOS

@interface DefaultViewController() { 
    UIInterfaceOrientation _preferredOrientation; 
} 

一些旋轉處理位

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return _preferredOrientation; 
} 

而且撥動

- (IBAction)toggleButtonPressed:(id)sender { 
    _preferredOrientation = UIInterfaceOrientationIsPortrait(_preferredOrientation) 
     ? UIInterfaceOrientationLandscapeRight 
     : UIInterfaceOrientationPortrait; 

    [self forceOrientationChange]; 
} 


- (void)forceOrientationChange 
{ 
    UIViewController *vc = [[UIViewController alloc] init]; 
    [self presentViewController:vc animated:NO completion:nil]; 

    [UIView animateWithDuration:.3 animations:^{ 
     [vc dismissViewControllerAnimated:NO completion:nil]; 
    } completion:nil]; 
} 

所以,這似乎很好地工作時,你只要按下切換按鈕,按預期的方向變化。但是當我開始改變設備的實際方向時,就存在一個問題。

步驟來重現問題:

以肖像取向
  • 按下按鈕以強制取向變化到橫向(保持在肖像實際設備)
  • 打開應用
  • 再次
  • 按下按鈕強制旋轉回縱向(仍保持設備縱向)
  • 旋轉的實際設備景觀沒有按下按鈕
  • 結果是視圖不旋轉到橫向,但狀態欄確實如此。

    Forced orientation change issue

    任何幫助將不勝感激!

    回答

    5

    我能夠提出和解聘視圖控制器之前添加以下行來解決這個問題發生了什麼:

    [UIViewController attemptRotationToDeviceOrientation]; 
    

    很難準確地說出它的工作原理。此呼叫要求嘗試通過調用shouldAutorotateToInterfaceOrientation:來匹配interfaceOrientationdeviceOrientation,如果返回YES,則嘗試匹配後續的旋轉方法。

    看起來接口和設備方向因爲儘管設備方向而強制接口方向所需的解決方法而陷入了不同步狀態。儘管在我看來仍然不應該發生,因爲解決方法仍然是所提供方法的合法使用。這可能是Apple的旋轉/定向堆棧中的一個錯誤。

    Complete方法:

    - (void)forceOrientationChange 
    { 
        UIViewController *vc = [[UIViewController alloc] init]; 
    
        [UIViewController attemptRotationToDeviceOrientation]; /* Add this line */ 
    
        [self presentViewController:vc animated:NO completion:nil]; 
    
        [UIView animateWithDuration:.3 animations:^{ 
         [vc dismissViewControllerAnimated:NO completion:nil]; 
        } completion:nil]; 
    } 
    
    1

    當我們談論的方向,他們是2個東西進入畫面:

    設備方向 接口方向 正如名字的明確而已,設備定向告訴,其中定位裝置,並界面方向表示您的應用呈現其界面的方向。

    這裏你正在做的是,你的應用程序支持所有的方向。您必須在項目中勾選標記所有方向。

    現在,當您將設備的方向從縱向更改爲橫向時,如果已將interfaceOrientation設置爲縱向模式,則會發生這種情況。隨着設備方向發生變化,狀態欄的方向也會改變。但是,正如你已經限制您的應用程序接口是在縱向,它不改變它的方向..

    所以這是你可以做什麼:

    1. 取消選中橫向支持您的應用程序&檢查問題是否仍然存在。
    2. 讓我知道,當你跟着第一步:)
    0

    使用此代碼:

    UIApplication *application = [UIApplication sharedApplication]; 
    [application setStatusBarOrientation:UIDeviceOrientationLandscapeLeft 
              animated:YES]; 
    [[UIDevice currentDevice] setOrientation:UIDeviceOrientationLandscapeLeft]; 
    [super updateViewConstraints]; 
    [self.view updateConstraints]; 
    
    +0

    使用意見;) –

    相關問題