Отключить анимацию поворота при изменении ориентации

Мне нужно отключить анимацию, которая воспроизводится при изменении ориентации. Это возможно? Если нет, можно ли его ускорить?

Чтобы уточнить, я не хочу останавливать изменение ориентации, только анимацию. Я хочу мгновенно сменить ориентацию.


person Arlen Anderson    schedule 27.11.2010    source источник
comment


Ответы (5)


Если я правильно помню (это всегда та вещь, с которой мне приходится немного поиграть, чтобы понять, что нужно), willRotateToInterfaceOrientation:duration: и willAnimateRotationToInterfaceOrientation:duration: находятся внутри блока анимации, а didRotateFromInterfaceOrientation: запускается после блока анимации. Я считаю, что вам нужно разместить свои представления в willRotate, чтобы они отображались в том положении, в котором они появлялись бы после поворота, если бы они не были повернуты (если это имеет смысл). Таким образом, анимация будет преобразовывать их из исходного (правильного) макета в новый (повернутый) макет в направлении, противоположном вращению устройства, создавая впечатление отсутствия анимации. После завершения вращения вы можете размещать свои виды без анимации в didRotate, создавая впечатление, что они вращаются мгновенно.

Ясно, как грязь, не так ли?

person Adam Milligan    schedule 27.11.2010
comment
к сожалению, это устарело в iOS 8+ - person Duck; 14.03.2017

Да, можно отключить анимацию, не разбивая все на части.

Следующие коды отключат анимацию вращения «черного ящика», не вмешиваясь в другие анимации или код ориентации:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [UIView setAnimationsEnabled:YES];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [UIView setAnimationsEnabled:NO];
  /* Your original orientation booleans*/

    return TRUE;
}

Поместите его в свой UIViewController, и все должно быть хорошо. Тот же метод можно применить к любой нежелательной анимации в iOS.

Удачи в вашем проекте.


Похоже, что в 2016 г. shouldAutorotateToInterfaceOrientation нельзя переопределить. Следующее, кажется, работает и не причиняет никакого другого вреда.

// these DO SEEM TO WORK, 2016
override func willRotateToInterfaceOrientation(
        toInterfaceOrientation:UIInterfaceOrientation, duration:NSTimeInterval)
    {
    UIView.setAnimationsEnabled(false)
    super.willRotateToInterfaceOrientation(toInterfaceOrientation,duration:duration)
    }
override func didRotateFromInterfaceOrientation(
        fromInterfaceOrientation:UIInterfaceOrientation)
    {
    super.didRotateFromInterfaceOrientation(fromInterfaceOrientation)
    UIView.setAnimationsEnabled(true)
    }

Однако !! Действительно, обе эти функции устарели. viewWillTransitionToSize теперь заботится как о «до», так и о «после».

override func viewWillTransitionToSize(size:CGSize,
       withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
    {
    coordinator.animateAlongsideTransition(nil, completion:
        {_ in
        UIView.setAnimationsEnabled(true)
        })
    UIView.setAnimationsEnabled(false)
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
    }
person Nils Munch    schedule 09.06.2011
comment
@teedayf Нет проблем. Это полезно во многих местах, где вы хотите убрать анимацию по умолчанию. - person Nils Munch; 05.06.2012
comment
У меня тоже не сработало ... но добавление его в willRotateToInterfaceOrientation сработало. - person Lawson; 29.09.2013
comment
@Lawson - FWIW, теперь они устарели. Смотрите редактировать! - person Fattie; 14.07.2016
comment
к сожалению, это устарело в iOS 8+ - person Duck; 14.03.2017

В iOS8 вы можете отключить анимацию вращения, отключив анимацию CALayer в реализации viewWillTransitionToSize вашего контроллера представления.

Обратное вращение, упомянутое в принятом ответе, полезно, если вы хотите настроить переход (см. WWDC 2014 «Просмотр улучшений контроллера в iOS 8»), но не если вы просто хотите предотвратить анимацию.

(Примечание: реализация viewWillTransitionToSize предотвратит вызов устаревших API ротации до iOS8.)

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        // You could make a call to update constraints based on the
        // new orientation here.
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [CATransaction commit];
    }];
}
person adamz    schedule 02.04.2015
comment
это странно работает только для iPhone, на iPad вращение экрана анимировано системой :( - person Peter Lapisu; 24.02.2016
comment
Он отключает любую анимацию, это бесполезно. - person Pedro Paulo Amorim; 04.04.2016

Основываясь на ответе Нильса Мунка, это версия Swift 3:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: nil) { (_) in
        UIView.setAnimationsEnabled(true)
    }
    UIView.setAnimationsEnabled(false)
    super.viewWillTransition(to: size, with: coordinator)
}
person Bruno Paulino    schedule 23.01.2017

если вы измените компоновку своих представлений, когда представление собирается повернуться, я думаю, что когда он действительно вращается, у него не будет анимации. Я имею в виду, напишите метод с новыми координатами, кадрами, позициями для каждого подпредставления и вызовите этот метод в willRotateToInterfaceOrientation:duration: или willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: (хотя это не самый разумный способ делать что-то. Интересно, почему вам не нужна анимация?)

person nacho4d    schedule 27.11.2010
comment
Я вручную меняю ориентацию в контроллере модального представления. Когда я отключаю контроллер модального представления, я хочу, чтобы ориентация уже изменилась. - person Arlen Anderson; 27.11.2010
comment
Затем вы можете попытаться настроить родительский контроллер так, чтобы он не вращался непосредственно перед появлением контроллера модального представления. Затем покажите свой модальный контроллер представления (возможно, сначала поверните его), скройте его, и родительский контроллер должен быть таким же, как и раньше. Я считаю. Или, может быть, попробуйте поиграть с такими соучастиями - person nacho4d; 27.11.2010
comment
Ты не понимаешь. Родительский вид допускает только одну ориентацию. В модальном представлении есть кнопка переключения, которая позволяет выбрать ориентацию. Например: родительский вид находится в портретной ориентации, вы открываете модальное представление и выбираете альбомную ориентацию. Модальное окно закрывается, и родительский вид переходит в альбомную ориентацию. Все это работает, но анимация неуклюжая, и я бы хотел от нее избавиться. Я бы хотел, чтобы родительский вид уже переключил ориентацию, когда модальное представление закрывается. - person Arlen Anderson; 27.11.2010