【问题标题】:Disable orientation change rotation animation禁用方向更改旋转动画
【发布时间】:2010-11-27 03:57:30
【问题描述】:

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

澄清一下,我不想停止方向变化,只是动画。我想要立即改变方向。

【问题讨论】:

标签: iphone objective-c ios animation orientation


【解决方案1】:

是的,可以禁用动画,而不会破坏所有内容。

以下代码将禁用“黑盒”旋转动画,而不会与其他动画或方向代码混淆:

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

【讨论】:

  • @teedayf 没问题。它在您希望默认动画消失的许多地方很有用。
  • 对我也不起作用...但将其添加到 willRotateToInterfaceOrientation 确实有效。
  • @Lawson - FWIW,现在已弃用。查看编辑!
  • 不幸的是,这在 iOS 8+ 上已被弃用
  • swiftui的任何解决方案?
【解决方案2】:

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

如果您想自定义过渡(请参阅 WWDC 2014 'View Controller Advancements in iOS 8'),则接受的答案中提到的反向旋转很有用,但如果您只想阻止动画,则不是。

(注意,实现 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];
    }];
}

【讨论】:

  • 这奇怪的是只适用于 iPhone,在 iPad 上屏幕旋转是系统动画:(
  • 它禁用任何动画,它没有用。
【解决方案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)
}

【讨论】:

    【解决方案4】:

    如果我没记错的话(这总是我必须玩一会儿才能正确的事情)willRotateToInterfaceOrientation:duration:willAnimateRotationToInterfaceOrientation:duration: 都在动画块内,而 didRotateFromInterfaceOrientation: 在动画之后运行堵塞。我相信您需要在willRotate 中布置您的视图,以便它们出现在旋转后它们出现的位置如果它们没有旋转(如果有意义的话)。这样,动画会将它们从原始(正确)布局动画到与设备旋转相反的方向上的新(旋转)布局,从而创建没有动画的外观。旋转完成后,您可以在 didRotate 中布置视图,无需动画,给人一种即时旋转的印象。

    一清二楚,不是吗?

    【讨论】:

    • 不幸的是,这在 iOS 8+ 上已被弃用
    【解决方案5】:

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

    【讨论】:

    • 我在模态视图控制器中手动更改方向。当我关闭模态视图控制器时,我希望方向已经改变。
    • 然后您可以尝试将您的父控制器设置为在模态视图控制器出现之前不旋转。然后显示你的模态视图控制器(也许先旋转它),隐藏它,父控制器应该和以前一样。我相信。或者尝试使用这种组合
    • 你误会了。父视图只允许一个方向。模态视图有一个切换按钮,允许您选择哪个方向。例如:父视图是纵向的,您打开模态视图并选择横向。模式关闭,父视图变为横向。这一切都有效,但动画很笨拙,我想摆脱它。我希望在模态视图关闭时父视图已经切换了方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多