禁用方向更改旋转animation

我需要禁用方向更改时播放的animation。 这可能吗? 如果没有,是否有可能加快速度?

只是为了澄清,我不想停止方向改变,只是animation。 我想要立即改变方向

如果我没有记错的话(这总是需要玩的东西), willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration:都在animation块内,而didRotateFromInterfaceOrientation:在animation块之后运行。 我相信你会需要在willRotate展示你的观点,这样他们就会出现在他们没有轮换之后他们将会出现的位置(如果有意义的话)。 通过这种方式,animation会将它们从原始(正确)布局移动到与设备旋转相反方向的新(旋转)布局,从而创build没有animation的外观。 一旦旋转完成,您可以在didRotate放置您的视图,而不需要animation,给人一种即时旋转的印象。

清除泥浆,不是?

是的,可以禁用animation,而不会破坏一切。

以下代码将禁用“黑匣子”旋转animation,而不会混淆其他animation或方向代码:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [UIView setAnimationsEnabled:YES]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { [UIView setAnimationsEnabled:NO]; /* Your original orientation booleans*/ return TRUE; } 

把它放在你的UIViewController中,一切都会好的。 同样的方法可以应用于任何不受欢迎的iOSanimation。

祝你的项目好运。


对于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) } 

然而!! 事实上,这两个function都被弃用了。 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中,您可以禁用旋转animation,方法是在视图控制器的viewWillTransitionToSize实现中禁用CALayeranimation。

如果您想自定义转换(请参阅WWDC 2014'View Controller Advancements in iOS 8'),但是如果您只是想防止animation,则接受的答案中提到的反转非常有用。

(注意:实现viewWillTransitionToSize将防止被弃用的iOS8之前的旋转API被调用。)

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

基于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) } 

如果在视图即将旋转时重新布置视图,我认为当它真的旋转时,它将不会有animation。 我的意思是,用每个子视图的新坐标,框架和位置编写一个方法,并在willRotateToInterfaceOrientation:duration:调用该方法willRotateToInterfaceOrientation:duration: or willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:这不是一个聪明的方法,但是为什么你需要无animation?)