У меня есть приложение для iPad, созданное с использованием шаблона SplitView.Интересно, как лучше всего ограничить приложение в альбомном режиме?
Я попытался переопределить метод shouldAutorotateToInterfaceOrientation:
в DetailViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
, но 4.2GM все еще глючит и не может отображать вид контроллера.Какие еще варианты у меня есть?
Заранее спасибо.
UPDATE1
Я уже подал отчет об ошибке: Идентификатор ошибки # 8620135
Мое приложение почти завершено, и мне нужно найти обходной путь, так как я не думаю, что они собираются решить эту проблему до 4.2официально выходит (GM уже вышел!)
Чтобы воссоздать ошибку, просто используйте шаблон SplitView и переопределите вышеуказанный метод в любом из UIViewControllers (RootViewController или DetailViewControllers)
ОБНОВЛЕНИЕ2
Я нашел обходной путь.(См. UPDATE3 для полного обхода)
Установите UISupportedInterfaceOrientations только для поддержки Landscape, это заставит приложение запускаться в ландшафтном режиме, позволяя DetailViewController запускаться правильно (следовательно, отображается правильно)
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
Но если вы поворачиваете устройство, оно переключается в портретный режим !!!, поэтому все равно необходимо переопределить shouldAutorotateToIntercafeOrientation
: как указано выше
Обсуждение:
Если это не будет ошибкой, я буду ожидать предупреждения или ошибки выполнения, исключения или чего-то еще при запуске приложения в ориентации, которая не поддерживается контроллером представления.Кроме того, почему только DetailViewController не показывает?Если это будет спецификация, тогда RootViewController также не сможет загрузиться.Ты не думаешь?спасибо за вашу помощь ...;)
ОБНОВЛЕНИЕ3
После дальнейших испытаний я понял, что вышеупомянутый обходной путь не работает в некоторых случаях.Например, при запуске приложения, когда устройство находится в альбомной ориентации, не будет работать!По-видимому, реальная проблема заключается в том, что в 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, а не каждый раз, когда появляется его представление.Следовательно, чтобы увидеть эту ошибку, убедитесь, что приложение было прекращено раньше.