2016-09-29 8 views
1

Моей целью является изменение ориентации блокировки/разблокировки с помощью кнопки. В режиме блокировки ориентацию можно переключать кнопкой, а в режиме разблокировки ориентация определяется датчиком.
Я пытался достичь этого с помощью [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:orientation] forKey:@"orientation"], но этот код имеет проблему.
Предположим, что в настоящее время мое приложение является «Режим блокировки, пользовательский интерфейс портрета, портретное устройство». Затем я поворачиваю устройство влево и выравниваю ориентацию. Я ожидал, что [[UIDevice currentDevice] orientation] должно быть UIDeviceOrientationLandscapeLeft. Но значение было UIDeviceOrientationPortrait, хотя реальное устройство в ландшафте!Как изменить ориентацию пользовательского интерфейса без [UIDevice setValue: forKey: @ "orientation"]

Я попробовал также центр уведомлений с кодом ниже.

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

Но этот код не работает должным образом. Если устройство находится в ландшафтном режиме, а ориентация пользовательского интерфейса установлена ​​на портрет с помощью [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:UIDeviceOrientationPortrait], onDeviceOrientationChanged не вызывается, когда я поворачиваю устройство на портрет. Я думаю, что значение ориентации устройства уже настроено на портрет (по моему коду, а не по датчику).

пс. Конечно, я проверил Обязательный полный экран.

EDIT: Было бы также хорошим ответом, чтобы узнать, как получить реальную ориентацию устройства, на которое не влияет [[UIDevice currentDevice] setValue].

ответ

2

Я решил эту проблему, используя MotionManager. Когда я фиксирую (или изменяю) ориентацию, [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:orientation] forKey:@"orientation"] достаточно, как обычно.
Однако, когда я разблокирую ориентацию, я обновил ориентацию, используя MotionManager с нижеследующим кодом.

CMMotionManager motionManager = [[CMMotionManager alloc] init]; 

[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
    withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { 
     [motionManager stopAccelerometerUpdates]; 

     CMAcceleration acceleration = accelerometerData.acceleration; 
     UIInterfaceOrientation orientation; 
     if (acceleration.x >= 0.75) { 
      orientation = UIInterfaceOrientationLandscapeLeft; 
     } else if (acceleration.x <= -0.75) { 
      orientation = UIInterfaceOrientationLandscapeRight; 
     } else if (acceleration.y <= -0.75) { 
      orientation = UIInterfaceOrientationPortrait; 
     } else if (acceleration.y >= 0.75) { 
      orientation = UIInterfaceOrientationPortraitUpsideDown; 
     } else { 
      return; 
     } 
     [[UIDevice currentDevice] setValue:[NSNumber numberWithInt:orientation] 
          forKey:@"orientation"]; 
     [UINavigationController attemptRotationToDeviceOrientation]; 
    }]; 

Конечно, вы должны знать о supportedInterfaceOrientations и shouldAutorotate методов.

+1

'UINavigationController tryRotationToDeviceOrientation];' эта строка действительно помогла мне. благодаря – C0D3LIC1OU5