ios – 在tabViewController setSelectedIndex之后,旋转不为视图设置动画

状态栏(具有时钟和电池图标)的旋转动画发生,但视图本身只是改变大小,它不执行页面翻转动画.在gif(下面)中,我做了几个慢动作旋转动画的屏幕截图.您可以看到时钟和电池图标旋转到视图中,即使内容只是缩放.

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](回到原文)
>旋转现在不会可靠地发生

解决方法

任何人都知道为什么viewcontroller的内容会在旋转期间停止动画?

>子视图控制器的旋转方法配置不正确.
>您的子视图控制器未收到轮换消息.
>您在视图控制器的布局方法中有自定义代码.
>您的代码动态地改变旋转/布局/动画方法.

我正在寻找有关哪种错误可以产生此类错误的方向.

这是看到你的代码很难回答的问题,但这里是我在解决这个问题时会采取的步骤.

>确认您的子视图控制器已正确设置以进行旋转.

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

相关文章

在有效期内的苹果开发者账号(类型为个人或者公司账号)。还...
Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台...
苹果在9月13号凌晨(北京时间)发布 iOS 16,该系统的设备可...
计算机图形学--OpenGL递归实现光线追踪
Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Li...