Контроллеры автоповорота и нескольких представлений

Я создаю приложение для iPad, которое должно работать только в портретном и перевёрнутом режимах. По соображениям производительности в моем методе applicationDidFinishLaunching я создаю несколько viewController и добавляю их в свое главное окно в качестве подпредставлений. Затем я скрываю те, которые не хочу сразу видеть. Нет панели вкладок или контроллера навигации.

Моя проблема в том, что, похоже, только первый viewController получает вызовы поворота. Я проверил это, поменяв местами порядок, в котором я добавляю подпредставления в главное окно и NSLog. Есть ли способ заставить все контроллеры принимать звонки?

Некоторые из моих представлений предназначены для наложения поверх другого представления, но это представление не всегда будет одним и тем же, поэтому кажется, что имеет смысл иметь представление наложения в отдельном контроллере представления. Я делаю что-то в корне неправильно, и поэтому веду себя не так, как я ожидал?

РЕДАКТИРОВАТЬ: принятый ответ на этот вопрос, похоже, указывает на точную проблему, с которой я столкнулся: методы поворота UIViewController

РЕДАКТИРОВАТЬ 2: Другой вопрос, который подтверждает, что только «основной» контроллер представления будет получать события поворота. Действительно ли мне нужно поместить весь свой код в один контроллер представления, который имеет несколько представлений? Несколько контроллеров представления на экране одновременно?


person Ben Williams    schedule 07.06.2010    source источник


Ответы (4)


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

person Ben Williams    schedule 08.06.2010
comment
Остерегайтесь на iphone, если у вас есть контроллер модального представления, ваш контроллер корневого представления не будет получать события вращения ... - person jjxtra; 15.03.2012
comment
@ alku83 Что вы имеете в виду под этим контроллером представления, тогда он содержит все соответствующие контроллеры подвидов. ? - person cyrilchampier; 17.08.2012
comment
Это было некоторое время назад, но я, вероятно, имел в виду не добавлять несколько контроллеров представления в MainWindow. Вместо этого добавьте один контроллер представления, который затем будет размещать ваши другие контроллеры подчиненного представления по мере необходимости. - person Ben Williams; 21.08.2012

В AppDelegate вы должны использовать

[self.window setRootViewController:_controller];

вместо

[self.window addSubview:_controller.view];

И контроллер должен переопределить метод

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
person Alex Nazarov    schedule 25.04.2011

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

Решение было очень простым. Просто поместите контроллеры под разные оконные объекты.

Все объекты UIWindow получают события ориентации устройства и распространяют их на свои контроллеры подчиненного представления.

Итак, в конце концов я просто поменял местами UIWindow (s), и он отлично работает.

person Konstantinos Kontos    schedule 12.09.2010

Я наткнулся на эту страницу в поисках способа решить эту проблему для приложения для iPad, и я просто хочу поделиться тем, что я сделал, чтобы исправить это.

Я поместил следующий код в свой MainViewController (это мой rootController):

-(void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration {
    switch (toInterfaceOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            // My app has a toolbar, use CGRectMake(0, 0, 1024.0, 768.0) if your's doesn't 
            self.view.frame = CGRectMake(0, 20, 1024.0, 748.0);
            break;

        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            self.view.frame = CGRectMake(0, 20, 768.0, 1004.0);            
            break;

        default:
            break;
     }
}

После этого мои компоненты были перемещены в соответствии с настройками автоматического изменения размера, которые я ввел в Interface Builder.

person Francois Nadeau    schedule 29.09.2011