Самый легкий способ поддерживать несколько ориентаций? Как я загружаю пользовательский NIB, когда приложение находится в Среде?

У меня есть приложение, в котором я хотел бы поддерживать несколько ориентаций. У меня есть два .xib файла, которые я хочу использовать, myViewController.xib и myViewControllerLandscape.xib. myViewController.xib существует в проекте/Ресурсах и myViewControllerLandscape.xib существует в корневом каталоге проекта.

То, что я хочу сделать, использовать отдельный NIB (myViewControllerLandscape.xib) для моих вращений. Я пытаюсь обнаружить вращение в viewDidLoad lиконоскоп это:

if((self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight))
 {
  NSLog(@"Landscape detected!");
  [self initWithNibName:@"myViewControllerLandscape" bundle:nil];

 }

Но я вижу в gdb, что это не выполняется, когда приложение запускается с устройства в среде. Сообщение NSLog не стреляет. Почему это? Что я сделал неправильно?

Кроме того, если я явно поместил initWithNibName вызов функции в viewDidLoad метод, то перо не загружается, и это продолжает myViewController.xib файл. Что случилось с моим вызовом? Я должен указать пакет?

Спасибо!

35
задан Deepesh 16 October 2012 в 11:04
поделиться

1 ответ

Вы должны загрузить одно представление, затем проверить ориентацию и при необходимости загрузить другое. . Вы проверяете ориентацию в shouldAutorotateToInterfaceOrientation: , возвращая yes, если вы хотите повернуть.

Я использую контроллер навигации для управления переходом. Если у меня есть портретный вид и устройство вращается, я нажимаю альбомный вид, а затем открываю альбомный вид, когда он возвращается в портретный.

Изменить:

Я возвращаю ДА для всех ориентаций в shouldAutorotateToInterfaceOrientation: , но будет ли это вызвано при запуске приложения ? Вы помещаете свое представление внутрь этой функции?

Константы ориентации - это не глобальные переменные, которые вы запрашиваете, а, скорее, часть сообщений, отправляемых системой контроллеру. Таким образом, вы не можете легко определить ориентацию до загрузки контроллера представления. Вместо этого вы жестко настраиваете приложение для запуска в определенной ориентации (обычно портретной), а затем сразу же поворачиваете. (См. Мобильный Safari. Он всегда начинается с портретной ориентации, а затем поворачивается к альбомной.)

Это два метода, которые я использовал, чтобы поменять местами портретный и альбомный режимы просмотра.

Все три контроллера представления имеют этот метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Портрет имеет это:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
        [self.nav pushViewController:rightLVC animated:NO];
    }
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
        [self.nav pushViewController:leftLVC animated:NO];
    }
}

Каждый контроллер ландшафтной ориентации имеет следующее:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
        [self.nav popViewControllerAnimated:NO];
    }

Приложение запускается в портретной ориентации. Если ориентация устройства альбомная, она отталкивает соответствующие пейзажи. Когда устройство возвращается в портретную ориентацию, появляется пейзаж. Для пользователя это выглядит как то, что один и тот же вид перестраивается для другой ориентации.

40
ответ дан 27 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: