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

Итак, я последовал этой теме: Анимация перехода RootViewController для передачи window.rootViewController от A к B в C. Код выглядит так:

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

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

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

  1. Я установил для UISupportedOrientation альбомную ориентацию (кнопка "Домой" справа)
  2. для каждого контроллера представления в методе shouldAutoRotateToOrientation я установил только для ландшафта

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


person Chris Chen    schedule 08.11.2011    source источник


Ответы (2)


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

[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];

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

person Kalle    schedule 14.12.2011
comment
Спасибо, это исправило другое визуальное безумие, не имевшее ничего общего с вращением. Я отредактировал его, чтобы включить сохранение исходного состояния анимации, вместо того, чтобы предполагать, что оно должно быть ДА. - person benzado; 05.01.2012
comment
Похоже, у меня не работает iOS 6? Кто-нибудь еще может подтвердить? - person Steve; 29.09.2012
comment
у меня работает на iOS 6. Имеет смысл, что отключение анимации повлияет только на те анимации, которые были отправлены позже. - person Edward Huynh; 07.12.2012
comment
У меня работает и на iOS 6. - person Kalle; 07.12.2012
comment
У меня работает на iOS 6! Однако до сих пор не совсем понимаю, почему исправление работает. - person Joseph Lin; 21.05.2013
comment
Это решение работает намного лучше, чем существующие ответы на все подобные вопросы! Хорошо работает в iOS 7. Кстати, как я могу сделать переход между слайдами вверх / вниз? - person Greg Wang; 13.12.2013
comment
Только что обнаружил, что эта анимация вызывает предупреждение Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates. в симуляторе iOS 7. Есть какие-нибудь мысли по этому поводу? - person Greg Wang; 13.12.2013
comment
Я сам не получаю этого предупреждения - и, насколько я могу судить, он не делает снимков. Может быть, разместите здесь отдельный вопрос и ссылку и включите свой код? - person Kalle; 19.12.2013
comment
Прекрасно работает на iOS7! - person Gary Lyn; 03.01.2014
comment
Это решение отлично работает на ios6 и ios7 (и на обоих размерах). Я тестировал множество подобных решений, и это лучшее. Я не понимаю, почему это помогает мне и при других проблемах со зрением, но спасибо! - person Ramiro; 07.05.2014
comment
Хороший трюк. Это предотвращает анимацию содержимого нового rootViewController. Сначала мне пришлось много экспериментировать с внутренними вещами, я подумал, что это должно что-то с этим делать. Но нет, это на самом деле верхний уровень - переход window.rootVC. - person MkVal; 27.06.2014
comment
Определенно работает. iOS7.1. Работает лучше, чем другие очень похожие решения. - person micnguyen; 18.08.2014

Просто введите другой вариант анимации UIViewAnimationOptionAllowAnimatedContent:

[UIView transitionWithView:self.window duration:0.5 options:(UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent) animations:^{
    self.window.rootViewController = newViewController;
} completion:nil];
person Borut Tomazin    schedule 09.01.2013
comment
У меня это не работает. Новый контроллер представления по-прежнему отображается в портретном режиме, а затем поворачивается в альбомный режим, как описано в вопросе. - person Kristopher Johnson; 22.03.2013
comment
Для любого, кто читает это для iOS 8.3, это выглядит хорошо только с переходами Flip, но все же показывает изменение размера некоторых контроллеров в целевом контроллере. Использование setAnimationsEnabled дает лучший визуальный эффект. - person CryingHippo; 03.05.2015
comment
отличный ответ, позволяющий объектам анимироваться в переходном виде - person Fede Cugliandolo; 17.05.2016