禁用方向更改旋转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?)