Как ограничить мое приложение в ландшафтном режиме?

У меня есть приложение 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:)