Поддержка разных ориентаций в iOS 6.0 для разных контроллеров представления

У меня есть собственный контроллер с разделенным представлением в моем приложении с главным контроллером и подробным контроллером.

- (id)initWithMasterController:(UIViewController*)aMasterController
            detailedController:(UIViewController*)aDetailedController;

Контроллеры, предоставленные для главного контроллера и подробного контроллера, — это UINavigationController.

В рамках моего приложения есть два возможных случая обработки ориентации:

  1. Когда шесть комбинаций контроллеров используются в главном и подробном контроллере, для приложения поддерживаются все ориентации.
  2. Когда имеется StudentDetailsViewController только в контроллере деталей, могут поддерживаться только две возможные ориентации. (Пейзаж)

Когда когда-либо меняется ориентация устройства, в версиях ниже iOS 6.0 происходят следующие вещи.

  1. Вызывается метод -shouldAutorotateToInterfaceOrientation:. Ниже приведена реализация этого метода: во время выполнения я перенаправляю запрос главному контроллеру и контроллеру деталей одним и тем же вызовом.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {   
        BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation]
                   && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
        return res;
    }
    
  2. -shouldAutorotateToInterfaceOrientation masterController вернет TRUE. Реализация метода в StudentViewController приведена ниже.

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation)
                         : UIInterfaceOrientationIsPortrait(interfaceOrientation);
    }
    

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

С iOS 6.0:

При изменении ориентации устройства в версиях iOS 6.0 происходит следующее:

  1. Вызывается метод -shouldAutorotate контроллера разделенного представления. Его реализация ниже

    - (BOOL)shouldAutorotate {
        BOOL res = [masterController shouldAutorotate]
                   && [detailedController shouldAutorotate];
        return res;
     }
    
  2. Функция shouldAutorotate подробного контроллера вызывает метод navigationController. Реализация функции автоповорота в StudentController:

    - (BOOL)shouldAutorotate {
        return YES;
    }
    
    - (NSUInteger)supportedInterfaceOrientations {
        return (UIInterfaceOrientationMaskLandscapeLeft
                | UIInterfaceOrientationMaskLandscapeRight);
    }
    

Но с iOS 6.0 я не могу контролировать ориентацию. Несмотря на то, что вызывается метод supportInterfaceOrientations, при вызове метода shouldAutorotate класса StudentDetailsController из метода shouldAutorotate контроллера detailsController метод shouldAutorotateMethod не подчиняется параметрам, упомянутым в методеsupportInterfaceOrientations.

ОБНОВЛЕНИЕ:

Я прочитал документацию, и приведенные ниже примечания приведены в документ.

иногда может потребоваться динамическое отключение автоматического поворота. Например, вы можете сделать это, если хотите полностью подавить вращение на короткий период времени. Вы должны временно отключить изменения ориентации, если вы хотите вручную управлять положением строки состояния (например, при вызове метода setStatusBarOrientation:animated:).

Если вы хотите временно отключить автоматическое вращение, избегайте манипулирования масками ориентации для этого. Вместо этого переопределите метод shouldAutorotate на самом верхнем контроллере представления. Этот метод вызывается перед выполнением любой авторотации. Если он возвращает НЕТ, то вращение подавляется.

Можно ли временно отключить автоматический поворот на основе текущей ориентации?


person Krishnan    schedule 17.10.2012    source источник
comment
Форматирование кода не может быть сделано правильно.   -  person Krishnan    schedule 17.10.2012
comment
Вы решили проблему? У меня такая же проблема, и я не могу понять, как с этим справиться как для ios5, так и для 6   -  person Stas    schedule 11.04.2013
comment
Нет не решил..   -  person Krishnan    schedule 16.04.2013


Ответы (2)


Я считаю, что это какая-то проблема в iOS, когда rootViewController не консультируется с childViewController для их предпочтительной ориентации. Тем не менее, вы должны попробовать что-то вроде следующего:

 if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}

чтобы изменить ориентацию обратно на книжную для данного вида.

person Arunabh Das    schedule 31.12.2012

В классе делегата вашего приложения определите следующий метод, этот метод вызывается перед любыми другими методами поворота в приложении.

Создайте флаг (isRotationEnabled), который будет определять ориентацию вашего приложения.

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    

return self.isRotationEnabled ?
    UIInterfaceOrientationMaskAll :
    UIInterfaceOrientationMaskPortrait;
}

Измените этот флаг в зависимости от различных условий в вашем приложении, используя следующий код.

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.isRotationEnabled = NO;
person Ankit Kumar Gupta    schedule 10.05.2013