Переход анимации RootViewController, неправильная начальная ориентация

Итак, я последовал этой теме: RootViewController Switch Transition Animation, чтобы перевести window.rootViewController с A на B на C. Код выглядит следующим образом:

[UIView transitionWithView:self.window 
                  duration:0.5 
                   options: UIViewAnimationOptionTransitionFlipFromLeft 
                animations:^{
                               self.window.rootViewController = newViewController;
                } 
                completion:nil];

Проблема заключается в том, что мое приложение должно поддерживать только пейзаж, но во время перехода rootViewController новый диспетчер представлений отображается в портретном режиме, чем при быстром перемещении в альбомный режим.

Я уверен, что:

  • Я установил UISupportedOrientation в альбомную (домашняя кнопка справа)
  • для каждого viewcontroller, в методе shouldAutoRotateToOrientation, я устанавливаю только для пейзажа

Какая может быть другая причина?

Ответ 1

Я изучил это только сейчас, потому что я продолжал получать ту же проблему. Я случайно попробовал следующее, и он отлично работал:

[UIView
    transitionWithView:window 
    duration:0.5
    options:UIViewAnimationOptionTransitionCrossDissolve
    animations:^(void) {
        BOOL oldState = [UIView areAnimationsEnabled];
        [UIView setAnimationsEnabled:NO];
        [(ICApp *)sharedApplication.delegate window].rootViewController = self;
        [UIView setAnimationsEnabled:oldState];
    } 
    completion:nil];

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

Ответ 2

Просто добавьте еще один вариант анимации UIViewAnimationOptionAllowAnimatedContent:

[UIView transitionWithView:self.window duration:0.5 options:(UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent) animations:^{
    self.window.rootViewController = newViewController;
} completion:nil];