Как ограничить мое приложение в ландшафтном режиме?
У меня есть приложение 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, а не в любое время
появится его представление. Следовательно, чтобы увидеть эту ошибку, убедитесь, что приложение было прервано раньше.
Ответы
Ответ 1
Я задал вопрос с щедростью 500, что похоже на то, с чем вы столкнулись.
Из моего ограниченного опыта гораздо проще сделать приложение для ландшафтного iPhone, а не только для iPad. Я не уверен, почему есть какая-то разница, но шаги, которые Apple предлагает сделать, чтобы сделать их пейзажными, - не работают сами по себе.
Ответ 2
Попробуйте это (оно работает):
-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
return YES;
}
else
{
return NO;
}
}
Ответ 3
Проверьте это приложение iPhone в ландшафтном режиме, если вы еще этого не сделали. Я собирался предложить просто добавить UISupportedInterfaceOrientations в ваш Info.plist и указать две ландшафтные ориентации. Но, по-видимому, этого недостаточно, согласно ответам на цитируемый вопрос.
Ответ 4
Я считаю, что это BUG, и я столкнулся с этой проблемой. Это как-то связано с
UIInterfaceOrientationLandscapeLeft
Чтобы воспроизвести эту ситуацию:
1) Создайте новый проект iPad с использованием шаблона UISplitViewController
2) Редактировать info.plist
Supported interface orientations
-Landscape (left home button)
-Landscape (right home button)
3) DetailViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// return YES;
NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft);
return interfaceOrientation == UIInterfaceOrientationLandscapeLeft;
}
4) Запустите его.... Вы увидите пустой черный вид. и как бы вы ни поворачивались. "UIInterfaceOrientationLandscapeLeft" никогда не обнаруживается.
Кстати, работает nacho4d добавление BOOL check work-around. Thumbs UP:)