Контроллеры авторотации и множественного просмотра - PullRequest
2 голосов
/ 07 июня 2010

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 08 июня 2010

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

2 голосов
/ 25 апреля 2011

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

[self.window setRootViewController:_controller];

вместо

[self.window addSubview:_controller.view];

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
1 голос
/ 12 сентября 2010

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

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

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

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

0 голосов
/ 29 сентября 2011

Я наткнулся на эту страницу в поисках способа решения этой проблемы для приложения для 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;
     }
}

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

...