这个问题严格关于iOS9 +
假设您有一个普通的现代应用程序(autolayout,storyboard,universal),它允许所有四个轮换位置
您希望它以正常方式自动旋转,因此当用户将设备从横向旋转到纵向时,它将更改为新的基于约束的布局
但是在用户旋转设备期间,您只想要没有动画。你希望它只是点击"新的侧面或直立布局。
我能够实现这一目标的唯一方法是添加:
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 +
答案 0 :(得分:5)
据我所知,没有比这更好的方法了。
虽然您可以使用此方法声明一个单独的类,并使应用程序中的所有视图控制器成为其子类。
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中覆盖此方法,只要其视图将因旋转而改变大小,它将在任何地方禁用旋转动画。但是,如果该视图控制器未处于活动状态,则不会禁用动画。
答案 1 :(得分:5)
您可以使用方法调整。
这意味着要改变对" viewWillTransitionToSize"的调用。在您的应用程序中的任何视图控制器上调用" genericViewWillTransitionToSize"来代替。
这样您就不必在应用程序上使用子类或重复代码。
有了这种悲伤,你应该非常顽皮地调侃,强大的力量带来了巨大的责任。将课程放在一个你或下一个程序员将知道如何找到它的地方,当他想要将旋转动画返回给视图控制器时。
window