Ответ 1
Авторотация обрабатывается с помощью представления UIViewController (shouldAutorotateToInterfaceOrientation:
), поэтому один из подходов состоит в том, чтобы организовать вашу иерархию таким образом, чтобы управляемые представления управлялись одним контроллером представления и невращающимися представлениями другим контроллером представления. Оба этих корневых представления UIViewController требуют добавления в окно/супервизор.
Тонкость здесь заключается в том, что если у вас есть два представления контроллера просмотра на одном уровне (т.е. добавлено через addSubview:
), только первый контроллер представления (обычно окно rootViewController
) получит сообщение shouldAutorotateToInterfaceOrientation:
.
Я сам использовал этот подход для создания панели инструментов, которая вращается, в то время как основной вид не работает.
Apple Technical Q & A QA1688 ( "Почему мой UIViewController не вращается вместе с устройством?" ) немного рассказывает об этой проблеме.
Обновление для iOS 6:
В Autorotation теперь используются методы UIViewController
shouldAutorotate
и supportedInterfaceOrientations
. shouldAutorotate
по умолчанию возвращает YES
, но помните, что контроллер вида, отличный от rootViewController
, чей вид является прямым подсмотром окна, в любом случае НЕ будет принимать обратные вызовы вращения.
Пример кода для iOS 6:
Создайте новый проект с использованием шаблона "Single View Application" и убедитесь, что "Use Storyboards" отмечен. Мы будем использовать предоставленный класс ViewController
в качестве регулятора вращающегося представления (переименуйте его, если хотите), и создайте второй подкласс UIViewController
под названием NonRotatingViewController
. Хотя этот контроллер просмотра даже не получит обратные вызовы вращения, для полноты и ясности добавьте следующий код в NonRotatingViewController.m
:
- (BOOL)shouldAutorotate
{
return NO;
}
В файле MainStoryboard
перетащите новый объект контроллера представления и установите его класс в NonRotatingViewController
и установите его идентификатор раскадровки на "NonRotatingVC". В то время как вы там, измените цвет фона вида контроллера поворота, чтобы очистить (вместо него будет добавлен невращающийся вид) и добавьте метку для каждого представления. В AppDelegate.m
добавьте следующий код:
#import "NonRotatingViewController.h"
// ...
// ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NonRotatingViewController *nonRotatingVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"NonRotatingVC"];
[self.window addSubview:nonRotatingVC.view];
return YES;
}
Это просто создает экземпляр невращающегося контроллера представления и добавляет его вид непосредственно в окно (N.B., в этот момент окно rootViewController
уже установлено раскадровкой).
Запустите проект. Поверните устройство и удивляйтесь, если одна метка вращается, а другая остается неподвижной!
Пример кода pre iOS 6:
Я сделал это в новом проекте - новое приложение на основе View будет прекрасно. Добавьте два новых контроллера: RotatingViewController
и NonRotatingViewController
. Внутри каждого из их перьев я просто добавил ярлык, чтобы описать, должен ли просмотр вращаться или нет. Добавьте следующий код:
RotatingViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
NonRotatingViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) { // Or whatever orientation it will be presented in.
return YES;
}
return NO;
}
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
RotatingViewController *rotating = [[RotatingViewController alloc] initWithNibName:@"RotatingViewController" bundle:nil];
self.rotatingViewController = rotating;
[rotating release];
NonRotatingViewController *nonRotating = [[NonRotatingViewController alloc] initWithNibName:@"NonRotatingViewController" bundle:nil];
self.nonRotatingViewController = nonRotating;
[nonRotating release];
[self.window addSubview:self.rotatingViewController.view];
[self.window insertSubview:self.nonRotatingViewController.view belowSubview:self.rotatingViewController.view];
[self.window makeKeyAndVisible];
return YES;
}
Надеюсь, это поможет.