2013-03-13 97 views
3

幫我解決了任務 - 我有一個不能轉動它的接口的viewController:如何旋轉控制器中不允許旋轉其界面的視圖?

- (BOOL)shouldAutorotate { 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

但我需要旋轉它出現在該控制器alertView!所以如果用戶旋轉設備,alertView應該跟隨旋轉並且主界面靜止不動。我試着訂閱通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

但在我deviceRotated:我收到這樣的有效載荷通知: NSConcreteNotification 0x101dc50 {name = UIDeviceOrientationDidChangeNotification; object = <UIDevice: 0x103e640>; userInfo = { UIDeviceOrientationRotateAnimatedUserInfoKey = 1; }}

什麼是UIDeviceOrientationRotateAnimatedUserInfoKey?我如何使用它來了解當前的interfaceOrientation?或者建議獲取當前方向並旋轉alertView的更好方法。

我試圖用

(BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration但這些方法沒有得到所謂的iOS6的:(

此外,是否有任何其他的方法,你可以使用知道該設備正在旋轉到某個方向?提前致謝! PS我知道這項任務似乎有點愚蠢,但這是客戶的要求。對不起:)對不起:)

回答

5

中有一個orientation變量,其中包含當前設備方向。您可以使用它來代替界面方向(不會像您已經注意到的那樣旋轉)。

首先你訂閱設備方向的變化,好的地方是viewWillAppear和取消對viewWillDisappear

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(orientationChanged:) 
               name:UIDeviceOrientationDidChangeNotification 
               object:nil]; 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

在這個例子中,我們指出,我們要調用到orientationChanged:當設備旋轉,使得讓實現它:

#pragma mark - Orientation change events 
- (void)orientationChanged:(NSNotification*)notification { 
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation]; 

    // Calculate rotation angle 
    CGFloat angle; 
    switch (deviceOrientation) { 
     case UIDeviceOrientationPortraitUpsideDown: 
      angle = M_PI; 
      break; 
     case UIDeviceOrientationLandscapeLeft: 
      angle = M_PI_2; 
      break; 
     case UIDeviceOrientationLandscapeRight: 
      angle = - M_PI_2; 
      break; 
     default: 
      angle = 0; 
      break; 
    } 

    // Apply rotation 
    static NSTimeInterval animationDuration = 0.3; 
    [UIView animateWithDuration:animationDuration animations:^{ 
     _viewToRotate.transform = CGAffineTransformMakeRotation(angle); 
    }]; 
} 
+0

謝謝,這是最簡單的方法。 – Stas 2013-03-14 09:46:09

0

由於方向鎖定在特定位置,因此參考狀態欄不會有太大的幫助。我的建議是使用加速度計,並根據收到的XYZ值相應地更改alertView。您可以使用CGAffineTransformMakeRotation或CGAffineTransformRotate方法旋轉alertView。

使用加速計的一個例子是:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ 
accelerationValue[0] = acceleration.x; 
accelerationValue[1] = acceleration.y; 
accelerationValue[2] = acceleration.z; 
NSLog(@"Acceleration X-axis: %1.1f, Y-axis: %1.1f, Z-axis: %1.1f", acceleration.x, acceleration.y, acceleration.z); 
} 

過程中的加速計將需要建立並創造了各自的ViewController,但我想你明白我的意思。

+0

這有點奇怪......不是iOS 6有更優雅的處理方式嗎? – Stas 2013-03-13 16:56:20

+0

@Stas不是我能想到的。事實上,你限制支持的方向是什麼使這個問題棘手。 – David 2013-03-13 17:06:31

+0

我們是否有關於我們在iOS 6中旋轉的interfaceOrientation的信息(就像我們在iOS5中的方法'willRotateToInterfaceOrientation:'和'shouldRotateToInterfaceOrientation:')? – Stas 2013-03-13 17:30:30

2

我刪除了以前的答案,因爲我誤解了這個問題(其實這是一個非常奇怪的要求,但...)。我建議你使用一個容器視圖控制器具有無限旋轉面膜,然後添加你的控制器子:CVC旋轉事件轉發到基於以下方法孩子:

- (BOOL) automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers 
{ 
    return NO; 
} 

所以它會得到所有的事件和只轉發給你想要的那個孩子。

最後容器將管理警報並正確旋轉它。