Отключить анимацию вращения смены ориентации
Мне нужно отключить анимацию, которая воспроизводится при изменении ориентации. Это возможно? Если нет, возможно ли это ускорить?
Просто чтобы уточнить, я не хочу останавливать изменение ориентации, просто анимацию. Я хочу мгновенное изменение ориентации.
Ответы
Ответ 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:
(Это не умный способ делать что-то. Интересно, почему вам не нужна анимация?)