Как ограничить мое приложение в ландшафтном режиме? - PullRequest
13 голосов
/ 02 ноября 2010

У меня есть приложение для 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, а не каждый раз, когда появляется его представление.Следовательно, чтобы увидеть эту ошибку, убедитесь, что приложение было прекращено раньше.

Ответы [ 4 ]

2 голосов
/ 02 ноября 2010

Я задал вопрос с наградой 500, что похоже на то, с чем вы сталкиваетесь .

Из моего ограниченного опыта гораздо проще создать приложение для iPhone только в альбомной ориентации, чем приложение для iPad только в альбомной ориентации. Я не уверен, почему есть какая-то разница, но шаги, которые Apple говорит сделать, чтобы сделать его только для ландшафта, не работают сами по себе.

1 голос
/ 02 ноября 2010

Попробуйте это (это работает):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        return YES;
    }
    else 
    {
        return NO;
    }
}
0 голосов
/ 20 января 2011

Я считаю, что это ошибка, я тоже столкнулся с этой проблемой. Это как-то связано с

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 обходной путь. Недурно:)

0 голосов
/ 02 ноября 2010

Проверьте это приложение для iPhone в альбомном режиме , если вы еще этого не сделали.Я собирался предложить просто добавить UISupportedInterfaceOrientations в ваш Info.plist и указать две альбомные ориентации.Но, по-видимому, этого недостаточно, согласно ответам на цитируемый вопрос.

...