Отключить анимацию вращения с изменением ориентации - PullRequest
25 голосов
/ 27 ноября 2010

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

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

Ответы [ 5 ]

48 голосов
/ 09 июня 2011

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

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

- (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);
    }
12 голосов
/ 02 апреля 2015

В 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];
    }];
}
3 голосов
/ 23 января 2017

Судя по ответу Нильса Мунка, это версия 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)
}
2 голосов
/ 27 ноября 2010

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

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

0 голосов
/ 27 ноября 2010

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

...