Мне нужно отключить анимацию, которая воспроизводится при изменении ориентации. Это возможно? Если нет, можно ли его ускорить?
Чтобы уточнить, я не хочу останавливать изменение ориентации, только анимацию. Я хочу мгновенно сменить ориентацию.
Мне нужно отключить анимацию, которая воспроизводится при изменении ориентации. Это возможно? Если нет, можно ли его ускорить?
Чтобы уточнить, я не хочу останавливать изменение ориентации, только анимацию. Я хочу мгновенно сменить ориентацию.
Если я правильно помню (это всегда та вещь, с которой мне приходится немного поиграть, чтобы понять, что нужно), willRotateToInterfaceOrientation:duration:
и willAnimateRotationToInterfaceOrientation:duration:
находятся внутри блока анимации, а didRotateFromInterfaceOrientation:
запускается после блока анимации. Я считаю, что вам нужно разместить свои представления в willRotate
, чтобы они отображались в том положении, в котором они появлялись бы после поворота, если бы они не были повернуты (если это имеет смысл). Таким образом, анимация будет преобразовывать их из исходного (правильного) макета в новый (повернутый) макет в направлении, противоположном вращению устройства, создавая впечатление отсутствия анимации. После завершения вращения вы можете размещать свои виды без анимации в didRotate
, создавая впечатление, что они вращаются мгновенно.
Ясно, как грязь, не так ли?
Да, можно отключить анимацию, не разбивая все на части.
Следующие коды отключат анимацию вращения «черного ящика», не вмешиваясь в другие анимации или код ориентации:
- (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);
}
В 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];
}];
}
Основываясь на ответе Нильса Мунка, это версия 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)
}
если вы измените компоновку своих представлений, когда представление собирается повернуться, я думаю, что когда он действительно вращается, у него не будет анимации. Я имею в виду, напишите метод с новыми координатами, кадрами, позициями для каждого подпредставления и вызовите этот метод в willRotateToInterfaceOrientation:duration:
или willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
(хотя это не самый разумный способ делать что-то. Интересно, почему вам не нужна анимация?)