2010-07-09 5 views
7

Мое приложение iPhone демонстрирует нечетное поведение при запуске на iPad в отношении поддержки изменений ориентации.Проблема с изменением ориентации iPad

Приложение запускается с контроллером вида (называйте его видом A для аргумента) и навигационным контроллером, а shouldAutorotateToInterfaceOrientation возвращает YES только для портрета. На контроллер навигации я нажимаю контроллер вида (вид B), который также возвращает YES только для портрета. Затем я нажимаю другой контроллер вида (вид C) на навигационный контроллер, который поддерживает все вращения и настраивает элементы на экране в зависимости от ориентации для поворота.

Когда это выполняется на iPhone-симуляторе и устройстве, если вы поворачиваетесь на пейзаж в режиме просмотра C, а затем нажмите кнопку «Назад», чтобы вернуться к просмотру B, он делает правильную вещь и переключает вид B обратно в портретный режим. (В симуляторе он автоматически поворачивает симулятор обратно к портрету.)

Проблема, с которой я столкнулся, заключается в том, что, когда я делаю эту ту же последовательность событий на симуляторе и устройстве iPad, появляется вид B не поворачивается назад к портрету, а навигационный контроллер все еще показывает информацию для просмотра C. Затем я нажимаю кнопку «Назад», и вид остается тем же, но навигационный контроллер показывает нормальный вид B (но все еще в ландшафтном режиме) , Затем, если я снова нажму кнопку «Назад», появится надпись «A» под элементами позиции «B» и, наконец, снова нажав на кнопку «A», появится окно «A».

Если я иду, чтобы увидеть B на iPad и начать вращаться вокруг, shouldAutorotateToInterfaceOrientation срабатывает с NO, пока не достигнет режима портрета, а затем все вернется в нормальное состояние.

Приложение разрабатывается с последней выпущенной версией iPhone SDK и имеет следующие настройки: базовый SDK iPhone Simulator 4.0, целевое семейство устройств iPhone, развертывание iPhone для iPhone Цель iPhone OS 3.1.3.

Любые идеи?

+0

У меня точно такая же проблема, и я считаю, что это ошибка в iOS3.2. На моих iPhone'ах (3.1.2 и 4.0) все так, как должно быть. К сожалению, нет никакой (документированной) функции для ручной смены ориентации. Давайте посмотрим, что другие скажут здесь ... – cocoapriest

ответ

4

Apple, говорится:

Case: All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set.

Response: To make sure that all your child view controllers rotate correctly, you must implement shouldAutorotateToInterfaceOrientation for each view controller representing each tab or navigation level. Each must agree on the same orientation for that rotate to occur. That is, they all should return YES for the same orientation positions.

http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

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

+0

это не проблема. пожалуйста, внимательно прочитайте вопрос. Есть реальная разница между iPhone и iPad, как они справляются с этой проблемой ... – cocoapriest

+0

Я понимаю проблему, я просто передавал руководство Apple :) Если вы чувствуете, что это ошибка в симуляторе, вы должны подать радар с Apple об этом.Многие люди используют навигационные контроллеры с ориентацией, но я не могу найти какую-либо информацию о других, имеющих эту же проблему, хотя 3.2 уже давно отсутствует. – iwasrobbed

+2

Я думаю, что это относится к вашему делу. Ваш взгляд C поддерживает все ориентации, в то время как A и B поддерживают только портрет. Apple QA1688 говорит, что все контроллеры детского представления под управлением UINavigationController должны согласовать набор комментариев. У меня была та же проблема (vc не соглашался на ориентацию) в [этот вопрос] (http://stackoverflow.com/questions/3086684). – progrmr

0

Вот код, я использую, чтобы предотвратить эту ошибку:

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(M_PI/2); 
     self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 
    } 
    [UIView commitAnimations]; 
} 

и

- (void)viewDidLoad { 
    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     self.view.transform = CGAffineTransformIdentity; 
     self.view.transform = CGAffineTransformMakeRotation(-(M_PI/2)); 
     self.view.bounds = CGRectMake(0, 0, 320, 480);; 
    } 
    [UIView commitAnimations]; 
} 

Основываясь на том, что ориентация устройства находится, вам нужно будет изменить некоторые из кода ,

+0

Зачем устанавливать преобразование дважды? – progrmr

+0

Первый устанавливает тип преобразования (идентичность), а второй выполняет преобразование. Также должно быть указано, как поворачивать, если устройство находится в этой ориентации. Если устройство находится в ландшафте, интерфейс не будет вращаться, если он не находится в портретной ориентации. Код, который я отправил, предназначен для iPhone (320 и 480), но если ориентация устройства будет lanscape, представление будет выглядеть так, как будто оно находится в портрете, что позволяет пользователю наклонить устройство, чтобы установить его на портрет (наоборот). –

+0

Согласен с progrmr: вам не нужно назначать свойство преобразования дважды. Первое назначение будет просто проигнорировано, так как вы ничего не делаете с ним. 'CGAffineTransformMakeRotation' возвращает ничего, кроме поворота, означающего трансформацию идентичности с добавленным вращением. –

Смежные вопросы