У меня есть приложение iPad, созданное с использованием шаблона SplitView. Интересно, как лучше всего ограничить мое приложение в ландшафтном режиме?
Я попытался переопределить метод shouldAutorotateToInterfaceOrientation:
в DetailViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
но 4.2 GM по-прежнему глючит, и он не может отобразить представление контроллера. Какие у меня есть другие варианты?
Спасибо заранее.
Update1
-
Я уже опубликовал отчет об ошибке: Идентификатор ошибки # 8620135
-
Мое приложение почти закончено, и мне нужно найти work-arround, так как я не думаю, что они собираются решить это до того, как официально официально выйдет (GM уже вышел!)
Чтобы воссоздать ошибку, просто используйте шаблон SplitView и переопределите метод выше в любом из UIViewControllers (RootViewController или DetailViewControllers)
UPDATE2
Я нашел работу. (См. UPDATE3 для полной работы)
Установить UISupportedInterfaceOrientations только для поддержки ландшафта, это заставит приложение запускаться в ландшафтном режиме, позволяя DetailViewController запускаться правильно (отсюда показано правильно)
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Но если вы поворачиваете устройство, он поворачивает портретный режим!!!, поэтому по-прежнему необходимо переопределить shouldAutorotateToIntercafeOrientation
: как указано выше
Обсуждение:
Если это не будет ошибкой, я бы ожидал ошибку предупреждения или выполнения, исключение или что-то при запуске приложения в ориентации, которая не поддерживается контроллером представления. Кроме того, почему только DetailViewController не показывает? Если это будет спецификация, тогда RootViewController также не сможет загрузить. Вам не кажется? спасибо за помощь...;)
Update3
После дальнейших тестов я понял, что в некоторых случаях вышеописанная работа не работает. Например, при запуске приложения, когда устройство находится в ландшафте, не будет работать!. Реальная проблема заключается в том, что в iOS4.2GM UISplitViewController требуется, чтобы все его контроллеры имели все возможности вращения в момент загрузки. Поэтому необходимо обмануть его, чтобы он загружался в ландшафтном режиме, а затем не позволял ему вращать контроллеры своего вида.
Итак, вот новая работа для этого раздражающего iBug.
Шаг 1: Установите Info.plist следующим образом:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Step2 Установите новый флаг в DetailViewController.m или .h(из шаблона SplitView)
BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//WORK-ARROUND: Bug ID# 8620135.
if (lockRotation) {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}else{
return YES;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
//set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called
lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
}
- (void)viewDidAppear:(BOOL)animated {
//set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called
lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135.
[super viewDidAppear:animated];
}
ВАЖНОЕ ПРИМЕЧАНИЕ: Обратите внимание, что эта ошибка появляется только при загрузке UISplitViewController, а не в любое время появится его представление. Следовательно, чтобы увидеть эту ошибку, убедитесь, что приложение было прервано раньше.