Несколько ViewController - разные требования к автоповороту

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

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

В моем rootController -shouldAutorotateToInterfaceOrientation я мог бы сделать что-то вроде:

return [self.settingsController shouldAutorotateToInterfaceOrientation];

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


person DIJ    schedule 28.04.2011    source источник


Ответы (2)


На будущее я отвечу на свой вопрос.

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

self.view = _subLevelViewController.view;

or

[self.view addSubview:_subLevelViewController.view];

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

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

[self presentModalViewController:_subLevelViewController animated:YES];

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

person DIJ    schedule 09.09.2011

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

// "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:. Согласно ссылке на класс, он будет вызываться после запуска viewDidAppear: subViewController.

person Wienke    schedule 22.03.2012