Автоповорот обрабатывается UIViewController представления (shouldAutorotateToInterfaceOrientation:
), поэтому один из подходов состоит в том, чтобы упорядочить вашу иерархию таким образом, чтобы вращаемые представления управлялись одним контроллером представления, а невращаемые представления - другим контроллером представления. Затем оба этих корневых представления UIViewController необходимо добавить в окно/суперпредставление.
Тонкость здесь в том, что если у вас есть два представления контроллера представления на одном уровне (т.е. добавленные через addSubview:
), только первый контроллер представления (обычно rootViewController
окна) получит сообщение shouldAutorotateToInterfaceOrientation:
.
Я сам использовал этот подход для создания панели инструментов, которая вращается, а основной вид - нет.
Технические вопросы и ответы Apple QA1688 (" Почему мой UIViewController не вращается вместе с устройством?") немного рассказывает об этой проблеме.
Обновление для iOS 6:
Авторотация теперь использует методы shouldAutorotate
и supportedInterfaceOrientations
UIViewController
. shouldAutorotate
возвращает YES
по умолчанию, но помните, что контроллер представления, отличный от rootViewController
, представление которого является прямым подпредставлением окна, в любом случае НЕ будет получать обратные вызовы поворота.
Пример кода для iOS 6:
Создайте новый проект, используя шаблон «Приложение с одним представлением», и убедитесь, что установлен флажок «Использовать раскадровки». Мы будем использовать предоставленный класс 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;
}
Это просто создание экземпляра невращающегося контроллера представления и добавление его представления непосредственно в окно (примечание: в этот момент окно rootViewController
уже установлено раскадровкой).
Запустите проект. Вращайте устройство и удивляйтесь, как одна этикетка вращается, а другая остается неподвижной!
Пример кода до iOS 6:
Я сделал это в новом проекте - новое приложение на основе представления отлично подойдет. Добавьте два новых контроллера представления: 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;
}
Надеюсь, это поможет.
person
Stuart
schedule
08.09.2011