ios - 在 7.3/9/2+ Swift 中,设备旋转时如何禁用旋转动画?

标签 ios swift ios9 ios-autolayout autorotate

这个问题严格来说是关于 iOS9+ 的

假设您有一个普通的现代应用程序(自动布局、 Storyboard、通用),它允许所有四个旋转位置

enter image description here

您希望它以正常方式自动旋转,因此当用户将设备从横向旋转到纵向时,它会更改为新的基于约束的布局

但是您只是希望在用户旋转设备期间没有动画。您希望它只需“单击”即可进入新的横向或直立布局。

我能够实现这一目标的唯一方法是添加:

override func viewWillTransitionToSize(size:CGSize,
       withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
    {
    coordinator.animateAlongsideTransition(nil, completion:
        {_ in
        UIView.setAnimationsEnabled(true)
        })
    UIView.setAnimationsEnabled(false)
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator);
    }

一个 View Controller ,一个最高或接近最高的 VC,它包含其余的容器 View 或场景中的任何内容。

这与使用的古老想法基本相同 willRotateToInterfaceOrientation/didRotateFromInterfaceOrientation(这两个现在在现代 iOS 中都不可用)打开和关闭动画。

但是也有很多问题

  • 这在 AppWide 上不行,一团糟,是基于场景的

  • 关闭所有动画似乎非常糟糕

  • 你可以看到各种各样的赛道

这个问题严格来说是关于 iOS9+ 的

现在,有没有更好的方法来关闭支持横向/纵向的应用程序中的旋转动画???

这个问题严格来说是关于 iOS9+ 的

最佳答案

据我所知,没有更好的方法。

尽管您可以使用此方法声明一个单独的类,并将应用中的所有 View Controller 作为其子类。

class NoRotateAnimationVC: UIViewController {
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        UIView.setAnimationsEnabled(false)
        coordinator.notifyWhenInteractionEndsUsingBlock {_ in UIView.setAnimationsEnabled(true)}
    }
}

当您旋转设备时,所有需要更改其 View 大小的 View Controller 都会收到 viewWillTransitionToSize 方法调用。

您需要在您的应用中声明一次这个新类,然后将所有 View Controller 声明从类 MyViewController: UIViewController 更改为 MyViewController: NoRotateAnimationVC

提供的实现禁用所有动画并在转换后重新启用它们。因此,如果您仅在一个 View Controller 中重写此方法,只要其 View 会因旋转而改变大小,它就会禁用所有位置的旋转动画。但是,如果该 View Controller 未处于事件状态,则不会禁用动画。

关于ios - 在 7.3/9/2+ Swift 中,设备旋转时如何禁用旋转动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38381200/

相关文章:

ios - 使用 UIBezierPath 绘制像仪表一样的半圆形图像...!

ios - 二元运算符 * 不能应用于 Int 和 CGFloat 类型的操作数

swift - 使用 slider SWIFT4 调整 MKCircle 的大小

swift - 如何使用动态键和数据数组存储数据?

swift - iOS9 FileManager 文件权限更改

ios - 仅在 iOS 9 设备上出现错误

IOS 蓝牙应用程序 "Terminated due to signal 9"仅在后台模式下

objective-c - Xcode 在断点处停止时不显示代码

ios - ADALiiOS :Cannot add a new item in the keychain/O365-iOS-Connect-Swift

ios - 代码 7 : Unable to Convert OCUnit to XCTest