禁用方向更改旋转动画

时间:2010-11-27 03:57:31

标签: iphone objective-c ios animation orientation

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

只是为了澄清,我不想停止方向改变,只是动画。我希望立即改变方向。

5 个答案:

答案 0 :(得分:48)

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

以下代码将禁用“黑匣子”旋转动画,而不会弄乱其他动画或方向代码:

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

答案 1 :(得分:12)

在iOS8中,您可以通过在视图控制器的viewWillTransitionToSize实施中禁用CALayer动画来停用旋转动画。

如果您想要自定义过渡,则接受答案中提到的反向旋转非常有用(请参阅WWDC 2014'在iOS 8中查看控制器进度')但如果您只是想要阻止动画。

(N.B。实施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];
    }];
}

答案 2 :(得分:3)

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

答案 3 :(得分:2)

如果我没记错的话(这总是我必须花一点时间才能做到正确)willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration:都在动画块中,而{{1在动画块之后运行。我相信您需要在didRotateFromInterfaceOrientation:中显示您的观点,以便它们出现在旋转旋转后的位置(如果有意义的话)。通过这种方式,动画可以将它们从原始(正确)布局设置为与设备旋转相反方向的新(旋转)布局,从而创建无动画的外观。旋转完成后,您可以在willRotate中布置无动画的视图,给人的印象是它们会立即旋转。

清除泥土,没有?

答案 4 :(得分:0)

如果在视图即将旋转时重新布局视图,我认为当它真正旋转时,它将没有动画。 我的意思是,用每个子视图的新坐标,框架,位置编写一个方法,并在willRotateToInterfaceOrientation:duration:willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:中调用该方法 (虽然这不是一种聪明的做事方式。我想,你为什么不需要动画?)

相关问题