Дочернее представление не поворачивается от пейзажа к портрету и наоборот

Я делаю приложение для iPad. У меня есть контроль вида, который должен оставаться в ландшафте, это работает просто отлично.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{
   return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

С этой точки зрения, которую я нажимаю в другую, это дочернее представление должно поворачиваться на соответствующее вращение (альбомное или книжное), когда пользователь наклоняет свой ipad. в этом дочернем виде я использую этот код, чтобы это произошло, но это не работает. Это прилипает к ландшафту.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    return YES;
}

Ответы на вопрос(1)

Решение Вопроса

все контроллеры представления в его иерархии должны поддерживать ротацию.

ИзРеагирование на изменения ориентации документация:

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

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

Кроме того, вам не следует использовать несколько контроллеров представления для управления одним экраном.

ИзView Controller Руководство по программированию документация (выделение моя):

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

В этом случае я бы предложил отключить обработку поворота в контроллере родительского представления, изменить контроллер дочернего представления на просто представление (для соответствия вышеуказанным критериям) и вручную отслеживать изменения ориентации, чтобы обновить макет дочернего представления.

Вы можете отслеживать изменения ориентации, слушаяUIDeviceOrientationDidChangeNotification уведомление. Пример кода:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

[nc addObserver:self selector:@selector(yourSelector:)
    name:UIDeviceOrientationDidChangeNotification object:nil];
Обновить

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

Если это так, вы должны убедиться, что вы переопределилиshouldAutorotateToInterfaceOrientation: метод вашего контроллера навигации, чтобы вернутьсяYES а также ваш контроллер представления для поддержки обработки вращения.

 Sneezy21 мар. 2012 г., 09:15
Я собираюсь попробовать это позже в этот день.
 fibnochi21 мар. 2012 г., 14:48
Это действительно помогает
 Matt Rees05 дек. 2012 г., 16:52
Что касается заявления о UIViewControllers, как насчет пользовательских контроллеров контейнерных представлений? У них есть несколько контроллеров представления, размещенных на одном контроллере представления, Apple разрешила это начиная с iOS 5.

Ваш ответ на вопрос