У нескольких ViewController разные требования к автоматическому повороту

#iphone #ios #uiviewcontroller #uiinterfaceorientation

#iPhone #iOS #uiviewcontroller #ориентация uiinterfaceorientation

Вопрос:

У меня есть пара представлений, все из которых управляются их собственными контроллерами, некоторые из них вложенные. Я хотел бы поддерживать вращение, некоторым видам разрешено поворачиваться в любую ориентацию, некоторым только в одну из портретных ориентаций (обычную или перевернутую).

В моем случае мне нужно реализовать -shouldAutorotateToInterfaceOrientation в моем RootController, чтобы разрешить поворот для любого из вложенных представлений. Проблема в том, что RootController не знает, должен ли он разрешать поворот, потому что ему нужно задать это контроллеру вложенных представлений.

В моей ориентации RootController -shouldAutorotateToInterfaceOrientation я мог бы сделать что-то вроде:

 return [self.settingsController shouldAutorotateToInterfaceOrientation];
  

чтобы обеспечить необходимую логику поворота, но будет ли это правильным способом сделать это?
Я прочитал документ Apple о повороте, но на самом деле это не рассматривается.

Ответ №1:

Для дальнейшего использования я отвечу на свой собственный вопрос.

Моя проблема заключалась в том, что у меня были вложенные ViewControllers, и я отобразил представление ViewController подуровня, вызвав что-то вроде:

 self.view = _subLevelViewController.view;
  

или

 [self.view addSubview:_subLevelViewController.view];
  

По-видимому, такое вложение ViewController — это не то, что Apple намеревается для вас сделать.

Вы должны придерживаться 1 «root ViewController» и отображать другие ViewControllers, используя такие методы, как:

 [self presentModalViewController:_subLevelViewController animated:YES];
  

Больше информации по этому вопросу и очень хорошее чтение:
http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

Ответ №2:

Я нашел этот пост и упомянутый блог наиболее кратким руководством по созданию вложенных контроллеров просмотра. Это стоит обновить:

 // "self" is the root view controller.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    // The following is not available until iPhone 5.0:
    [self presentViewController:self.subViewController animated:YES completion:NULL];
else 
    // For iOS 4.3 and earlier, use this (deprecated in 5.0):
    [self presentModalViewController:self.subViewController animated:YES];
  

Я оставил здесь значение null, но обратите внимание, что новый метод позволяет отправлять встроенную функцию через completion: параметр. Согласно классу ref, он будет вызван после viewDidAppear: запуска subViewController.