Приложение iPhone только для альбомной ориентации с несколькими кончиками
Я разрабатываю приложение для iPhone, которое имеет несколько перьев и должно быть только в альбомной ориентации.
Приложение настроено на запуск в ландшафтном режиме через файл Info.plist.
У меня есть два вида контроллеров:FirstViewController
а также SecondViewController
,
Для каждого из них у меня есть файл пера, где вид в альбомной ориентации. Оба вида контроллеров добавлены в мой MainView
перья как розетки, и их взгляды лениво инициализируются.
Когда приложение загружается, первое представление отображается в альбомной ориентации, как и ожидалось. Однако, когда я переключаюсь на второй вид, устройство (или симулятор) остается в альбомной ориентации, но вид поворачивается, как если бы устройство находилось в портретном режиме, что тормозит мой интерфейс.
В обоих 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
Почему второй вид отображается в альбомной ориентации, но с повернутым интерфейсом?
Я не хотел бы иметь дело со свойствами преобразования, так как это кажется излишним.
2 ответа
Я пометил этот вопрос, надеясь, что кто-то даст вам проницательный ответ, и я кое-что узнаю... к сожалению, я боюсь, что вам, возможно, придется использовать преобразования, чтобы заставить это работать должным образом. Вот код, который я использовал в последнее время для решения этой проблемы:
- (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 в методе shouldAotorotate для второго представления. Или попробуйте сделать это в портретном виде в ИБ. Кажется, что ваш вид был загружен правильно (в альбомной ориентации), но затем получил сообщение "Должен быть автор" и был повернут на 90 градусов.