Отключить анимацию вращения смены ориентации

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

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

Ответ 1

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

Очистить как ил, нет?

Ответ 2

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

Следующие коды отключат анимацию вращения "черного ящика" без использования других анимаций или кода ориентации:

- (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);
    }

Ответ 3

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

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

(N.B. Внедрение 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];
    }];
}

Ответ 4

На основе Nils Munch Ответ, это версия 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)
}

Ответ 5

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