#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.