У меня есть собственный контроллер с разделенным представлением в моем приложении с главным контроллером и подробным контроллером.
- (id)initWithMasterController:(UIViewController*)aMasterController
detailedController:(UIViewController*)aDetailedController;
Контроллеры, предоставленные для главного контроллера и подробного контроллера, — это UINavigationController.
В рамках моего приложения есть два возможных случая обработки ориентации:
- Когда шесть комбинаций контроллеров используются в главном и подробном контроллере, для приложения поддерживаются все ориентации.
- Когда имеется StudentDetailsViewController только в контроллере деталей, могут поддерживаться только две возможные ориентации. (Пейзаж)
Когда когда-либо меняется ориентация устройства, в версиях ниже iOS 6.0 происходят следующие вещи.
Вызывается метод
-shouldAutorotateToInterfaceOrientation:
. Ниже приведена реализация этого метода: во время выполнения я перенаправляю запрос главному контроллеру и контроллеру деталей одним и тем же вызовом.- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation] && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; return res; }
-shouldAutorotateToInterfaceOrientation
masterController вернет TRUE. Реализация метода в StudentViewController приведена ниже.- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation) : UIInterfaceOrientationIsPortrait(interfaceOrientation); }
Возможность получить информацию о новой изменяемой ориентации помогает мне решить, следует ли включить вращение или нет.
С iOS 6.0:
При изменении ориентации устройства в версиях iOS 6.0 происходит следующее:
Вызывается метод
-shouldAutorotate
контроллера разделенного представления. Его реализация ниже- (BOOL)shouldAutorotate { BOOL res = [masterController shouldAutorotate] && [detailedController shouldAutorotate]; return res; }
Функция 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 на самом верхнем контроллере представления. Этот метод вызывается перед выполнением любой авторотации. Если он возвращает НЕТ, то вращение подавляется.
Можно ли временно отключить автоматический поворот на основе текущей ориентации?