UIDeviceOrientationDidChangeNotification возвращает UIOrientationLandscapeLeft для UIOrientationLandscapeRight

Я регистрирую свой контроллер просмотра для UIDeviceOrientationDidChangeNotification, и он возвращает неправильную ориентацию устройства. Я регистрирую его в функции инициализации viewcontroller

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

Это мой метод получения уведомлений устройства.

-(void)handleOrientationChangeNotification:(NSNotification *)notification
{ 
    if(IS_IPHONE)
    {
        UIDeviceOrientation currentDeviceOrientation =  [[UIDevice currentDevice] orientation];
    .
    .
    .
}

Всякий раз, когда менялась ориентация устройства, я всегда получаю неправильную ориентацию.


person Sunil Pandey    schedule 15.10.2012    source источник
comment
Это может помочь вам stackoverflow.com /вопросы/4330979/   -  person Mary Zareah    schedule 15.10.2012
comment
код, кажется, в порядке и работает .. вы отключили автоматическую компоновку в xib ..?   -  person vishy    schedule 15.10.2012
comment
вероятно, это происходит потому, что Apple изменила свою ориентацию в iOS6, как Apple делала в прошлых версиях.   -  person Kamar Shad    schedule 15.10.2012


Ответы (2)


Я нашел решение на сайте Apple в этом ссылка

UIDeviceOrientationLandscapeRight назначается UIInterfaceOrientationLandscapeLeft, а UIDeviceOrientationLandscapeLeft назначается UIInterfaceOrientationLandscapeRight. причина этого в том, что вращение устройства требует вращения содержимого в противоположном направлении.

person Sunil Pandey    schedule 15.10.2012

Вероятно, это происходит потому, что Apple изменила способ управления ориентацией UIViewController. В iOS6 Oreintation обрабатывает По-другому, в iOS6 shouldAutorotateToInterfaceOrientation метод устарел. Контейнеры iOS (такие как UINavigationController) не консультируются со своими дочерними элементами, чтобы определить, следует ли им выполнять автоповорот. По умолчанию ориентация интерфейса, поддерживаемая приложением и контроллером представления, установлена ​​на UIInterfaceOrientationMaskAll для идиомы iPad и UIInterfaceOrientationMaskAllButUpsideDown для идиомы iPhone.

Для получения дополнительной информации об этом вы должны посетить эту ссылку Ниже я создал категорию для обработки изменения ориентации.

Итак, вам нужно будет реализовать еще два метода для управления ориентацией UIViewController в iOS6.

Представлено в IOS6 Разрешить изменение ориентации

 - (BOOL)shouldAutorotate
  {

    return YES;

  }

Возвращает номер Oreintation, который будет поддерживаться устройством.

 - (NSUInteger)supportedInterfaceOrientations
 {
    return  UIInterfaceOrientationMaskAll;

 }

Теперь проверьте, какую ориентацию вы получаете.

РЕДАКТИРОВАТЬ: поместите этот код в свой FirstViewController, добавленный как корневой ViewController. Это поможет UIViewController определить его ориентацию.

@implementation UINavigationController (RotationIn_IOS6)

 -(BOOL)shouldAutorotate
  {
   return [[self.viewControllers lastObject] shouldAutorotate];
  }

  -(NSUInteger)supportedInterfaceOrientations
 {
   return [[self.viewControllers lastObject] supportedInterfaceOrientations];
 }

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
 {
   return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
 }

 @end

Надеюсь, я буду вам полезен.

person Kamar Shad    schedule 15.10.2012
comment
Спасибо @Камаршад. но на самом деле функции ориентации не имели ничего общего с моим кодом. Однако я нашел решение и разместил его как ответ на мой вопрос. - person Sunil Pandey; 15.10.2012