http://imgur.com/gallery/Q3OXCIH
我发现了一些相似但不完全相同的帖子:
iOS Device Rotation Instant Snap rather than animation
iOS 9 Orientation Auto-Rotation Animation Not Working,But Always on Main Thread
这有点可重复 – 首先,旋转正确,但在我以编程方式更改选项卡视图控制器索引后,它可以触发.触发后,在重置应用程序之前,视图不会发生旋转动画.
代码,我更改选项卡视图控制器,然后将其更改回来:
[appDelegate.tabBarController setSelectedindex:0]; ...code to operate on the code at index 0... [appDelegate.tabBarController setSelectedindex:2];
为了强调 – 当我第一次运行应用程序时,它会正确地为旋转设置动画.在模拟器和硬件中表现相同. IOS9. Xcode 7.1.1.
任何人都知道为什么viewcontroller的内容会在旋转期间停止动画?
编辑-
回答fragilecat的问题:
1)我被设置为使用旋转功能,如https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation所述
我已经实现了shouldAutorotatetoInterfaceOrientation和shouldAutorotate和supportedInterfaceOrientations.当viewcontroller加载时,supportedInterfaceOrientations被调用一次. shouldAutorotatetoInterfaceOrientation和shouldAutorotate显然从未被调用过.
2)我通过viewWillTransitionToSize接收大小更改消息 – 这是ios9所以没有任何轮换消息. willTransitionToTraitCollection显然从未被调用,但它被覆盖.我两个都叫超级.
3)我没有使用viewWillLayoutSubviews()或viewDidLayoutSubviews().我只是重写viewDidLoad和viewWillAppear.这些不会影响旋转.
4)我没有动态改变旋转方法.
我注意到的是旋转首先工作,然后失败(不旋转但只是缩放),在用户点击“确定”后以编程方式更改tabBarViewController selectedViewController到alertview.我还没弄清楚为什么会这样,但在那次活动之后它是重复的.
错误的顺序:
>工作正常,旋转确定.
>用户点击“确定”到警报视图
>我以编程方式调用[tabBarViewController setSelectedindex:0]
>我在索引0的viewcontroller上调用了一些函数.
>我以编程方式调用[tabBarViewController setSelectedindex:2](回到原文)
>旋转现在不会可靠地发生
解决方法
>子视图控制器的旋转方法配置不正确.
>您的子视图控制器未收到轮换消息.
>您在视图控制器的布局方法中有自定义代码.
>您的代码动态地改变旋转/布局/动画方法.
这是看到你的代码很难回答的问题,但这里是我在解决这个问题时会采取的步骤.
>确认您的子视图控制器已正确设置以进行旋转.
UIViewController Rotation Methods
>确认您的子视图控制器正在接收以下消息,以便您可以排除此问题,因为这是在iOS 9中处理轮换的方式.
func willTransitionToTraitCollection(_ newCollection:uitraitcollection,
withTransitionCoordinator协调员:UIViewControllerTransitionCoordinator)
func viewWillTransitionToSize(_ size:CGSize,
withTransitionCoordinator协调员:UIViewControllerTransitionCoordinator)
如果您要覆盖这些方法,请确保调用超级版本,有关详细信息,请参阅UIContentContainer.
>注释掉viewWillLayoutSubviews()
视图控制器实现中可能具有的任何自定义代码.您也可以在viewWillLayoutSubviews()
和viewDidLayoutSubviews()
之间查看您的相框.
编辑
您需要在主线程上执行选项卡更改.如果我是正确的你正在使用UIAlertView的代表?我不认为你在主线上打电话给你!
dispatch_async(dispatch_get_main_queue(),^{ [appDelegate.tabBarController setSelectedindex:0]; });