繁体   English   中英

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

[英]In 7.3/9/2+ Swift how to disable rotation animation, when device rotates?

这个问题严格关于iOS9 +

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

在此输入图像描述

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

但是在用户旋转设备期间,您只是想要没有动画。 你希望它只是“点击”到新的侧面或直立布局。

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

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

一个视图控制器,一个最高或接近最高的VC,它保存其余的容器视图或场景中的任何内容。

这与使用willRotateToInterfaceOrientation / didRotateFromInterfaceOrientation(现在都无法在现代iOS中使用)来开启动画的古老想法基本相同。

但是有很多问题

  • 这不起作用AppWide,它是一个烂摊子,它是基于场景的

  • 关闭所有动画似乎很糟糕

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

这个问题严格关于iOS9 +

这些天,有没有更好的方法来关闭支持横向/肖像的应用程序中的旋转动画???

这个问题严格关于iOS9 +

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

虽然您可以使用此方法声明一个单独的类,并使应用程序中的所有视图控制器成为其子类。

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

旋转设备时,视图需要更改其大小的所有视图控制器都会接收viewWillTransitionToSize方法调用。

您需要在应用程序中声明一次这个新类,然后将所有视图控制器声明从类MyViewController: UIViewController更改为MyViewController: NoRotateAnimationVC

提供的实现禁用所有动画,并在转换后重新启用它们。 因此,如果仅在一个View Controller中覆盖此方法,只要其视图将因旋转而改变大小,它将在任何地方禁用旋转动画。 但是,如果该视图控制器未处于活动状态,则不会禁用动画。

你可以使用Method swizzling

这意味着要在应用程序中的任何视图控制器上更改对“viewWillTransitionToSize”的调用,而不是调用“genericViewWillTransitionToSize”。
这样您就不必在应用程序上使用子类或重复代码。

有了这种悲伤,你应该非常顽皮地调侃,强大的力量带来了巨大的责任。 将课程放在一个你或下一个程序员将​​知道如何找到它的地方,当他想要将旋转动画返回到视图控制器时。

extension UIViewController {

    public override static func initialize() {
        struct Static {
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            let originalSelector = #selector(UIViewController.viewWillTransitionToSize(_:withTransitionCoordinator:))
            let swizzledSelector = #selector(UIViewController.genericViewWillTransitionToSize(_:withTransitionCoordinator:))

            let originalMethod = class_getInstanceMethod(self, originalSelector)
            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

            let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

            if didAddMethod {
                class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            } else {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
        }
    }

    // MARK: - Method Swizzling
    func genericViewWillTransitionToSize(size:CGSize,
                                           withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator)
    {
        self.genericViewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition(nil, completion:
            {_ in
                UIView.setAnimationsEnabled(true)
        })
        UIView.setAnimationsEnabled(false)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM