Очень прерывистая ориентация на устройстве и симуляторе - PullRequest
5 голосов
/ 22 января 2010

Я заметил, что у меня очень прерывистая ориентация на устройстве и симуляторе.

У меня есть модальный контроллер представления, который я представляю, и это единственная вещь в моем приложении, которая поддерживает вращение.

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

Это странно, потому что в 50% случаев это работает! Всякий раз, когда я запускаю его через XCode и устанавливаю точки останова в shouldAutorotateToInterfaceOrientation, он всегда работает!

Кто-нибудь когда-либо имел это или знает, что происходит?

Ответы [ 5 ]

1 голос
/ 06 апреля 2010

Поскольку, как вы упомянули «прерывистый», я бы сказал, что это как-то связано с тем, что вы делаете после поворота.

Чтобы найти ошибку, я предлагаю удалить любой код после поворота. Закомментируйте любые сетевые действия или операции OpenGL. Может также помочь закрыть XCode и снова открыть его.

Если ничего не помогает, я бы создал новый проект и начал бы перемещать файлы один за другим и проверял.

0 голосов
/ 31 мая 2010

Я наконец обнаружил, в чем проблема!

Оказывается, только первый UIView, который вы добавите к своему UIWindow, получит запрос на вращение или нет. Любые последующие просмотры не получают это сообщение. Мое приложение использовало другое представление для анимации вдали от Default.png, которое отображается при запуске, и оно было добавлено в окно первым!

0 голосов
/ 06 мая 2010

Звонит ли

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

когда вы показываете свою справочную информацию о вращении? (и, возможно, отключить его снова, когда вы отклоните его?)

Другая вещь, которую я бы искал, это подозрительные звонки на [UIWindow makeKeyWindow] или [UIResponder becomeFirstResponder].

Я бы также подписался на UIDeviceOrientationDidChangeNotification события и удостоверился, что модальное представление получило вызов [UIViewController shouldAutorotateToInterfaceOrientation:] для каждого полученного вами события.

0 голосов
/ 06 апреля 2010

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

  1. Вызовите presentModalViewController: на контроллере представления верхнего уровня в вашей иерархии, а не на более глубоком viewController.

  2. Если это не решает проблему, попробуйте создать подкласс вашего контроллера представления верхнего уровня и переопределить его shouldAutorotateToInterfaceOrientation: выглядеть примерно так:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if (self.modalViewController) {
        return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
0 голосов
/ 01 апреля 2010

Даже если вы попытаетесь запустить приложение в альбомной ориентации, ваш телефон запустит его в портретной ориентации, а затем перейдет в альбомную ориентацию в зависимости от положения телефона.

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

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)
interfaceOrientation duration:(NSTimeInterval)duration {    
    if (interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        self.view = self.portrait;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
        self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0);  
    }
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft)
    {
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
    }
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.view = self.portrait;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
        self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0);
    }
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = 
        CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...