Приложение для iPhone только в альбомной ориентации с несколькими перьями
Вопрос
Я разрабатываю приложение для iPhone, которое имеет несколько перьев и должно быть только альбомным.
Приложение настроено на запуск в ландшафтном режиме через файл Info.plist.
У меня есть два контроллера представления:FirstViewController
и SecondViewController
.
Для каждого из них у меня есть файл пера, в котором вид находится в альбомной ориентации.Оба контроллера представления добавлены в мой MainView
nib как розетки, и их представления лениво инициализируются.
Когда приложение загружается, первое представление отображается в альбомной ориентации, как и ожидалось.Однако, когда я переключаюсь на второй вид, устройство (или симулятор) остается в альбомной ориентации, но вид поворачивается, как если бы устройство находилось в портретном режиме, тормозя мой интерфейс.
В обоих UIViewController
классы у меня есть следующий код:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}
и для переключения представлений в делегате моего приложения я делаю:
[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];
где viewController
и secondViewController
— это две розетки, к которым подключены контроллеры представления.
Вот как выглядит второе представление в IB:альтернативный текст http://img27.imageshack.us/img27/4898/picture1ni.png
и вот как это выглядит в симуляторе:альтернативный текст http://img402.imageshack.us/img402/4866/picture2wt.png
Почему второй вид отображается в альбомной ориентации, но интерфейс повернут?
Мне не хотелось бы иметь дело со свойствами преобразования, поскольку это кажется излишним.
Решение
Я отметил этот вопрос звездочкой, надеясь, что кто-нибудь даст вам содержательный ответ, и я чему-то научусь..к сожалению, я боюсь, что вам, возможно, придется использовать преобразования, чтобы заставить это работать правильно.Вот код, который я использовал в последнее время для решения проблемы:
- (void)forceLandscapeForView:(UIView *)theView {
theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
theView.bounds = CGRectMake(0, 0, 480, 320);
theView.center = CGPointMake(160, 240);
[theView setNeedsLayout];
[theView setNeedsDisplay];
}
Затем, когда вы добавляете новый вид, проверьте текущую ориентацию и, если необходимо, принудительно поверните:
if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
[self forceLandscapeForView:_activeViewController.view];
}
Тогда, конечно, вы захотите ответить соответствующим образом на shouldAutorotateToInterfaceOrientation
в каждом из ваших контроллеров представления:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
Я хотел бы услышать об альтернативных решениях, если это не обязательно.В этой настройке я также заметил один нюанс:Если у вас есть переход между представлениями и вы поворачиваете телефон во время этого перехода, ориентация представлений может перевернуться или «застрять» в неправильной альбомной ориентации, так что вам придется перевернуть телефон (пейзажная или правая ориентация). ландшафт-слева) при переходе между видами.
Другие советы
это всего лишь предложение, но вы можете попробовать вернуть NO в методе mustAotorotate для второго представления.Или попробуйте сделать это в портретном режиме в ИБ.Кажется, ваш вид был загружен правильно (в ландшафтном режиме), но затем получил сообщение mustAutorotate и был повернут на 90 градусов.