在tabViewController setSelectedIndex

时间:2015-12-02 21:13:51

标签: ios xcode

状态栏(具有时钟和电池图标)会发生旋转动画,但视图本身只会改变大小,它不会执行页面翻转动画。在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的内容会在轮换期间停止动画?

编辑 -

回答脆弱的问题:

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)我没有动态改变旋转方法。

我注意到的是,旋转首先工作,但是然后失败(不旋转但只是缩放),在使用点击" ok"之后以编程方式更改tabBarViewController selectedViewController之后到一个提醒视图。我还没弄清楚为什么会这样,但是在那次活动之后它是重复的。

错误的顺序:

  1. 工作正常,旋转确定。
  2. 用户点击"确定"到alertview
  3. 我以编程方式调用[tabBarViewController setSelectedIndex:0]
  4. 我在索引0的viewcontroller上调用了一些函数。
  5. 我以编程方式调用[tabBarViewController setSelectedIndex:2](回到原始版本)
  6. 旋转现在不能可靠地发生

1 个答案:

答案 0 :(得分:3)

任何人都知道为什么viewcontroller的内容会在轮播期间停止制作动画?

  1. 子视图控制器的旋转方法配置不正确。
  2. 您的子视图控制器未收到轮换消息。
  3. 您在视图控制器的布局方法中有自定义代码。
  4. 您的代码正在动态改变旋转/布局/动画方法。
  5. 我正在寻找指出哪种错误可以产生此类错误。

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

    1. 确认您的子视图控制器已正确设置以进行轮换。
    2. UIViewController Rotation Methods

      1. 确认您的子视图控制器正在接收以下消息,以便您可以排除此问题,因为这是在iOS 9中处理轮换的方式。

        func willTransitionToTraitCollection(_ newCollection:UITraitCollection,        withTransitionCoordinator协调员:UIViewControllerTransitionCoordinator)

        func viewWillTransitionToSize(_ size:CGSize, withTransitionCoordinator协调员:UIViewControllerTransitionCoordinator)

      2. 如果您要覆盖其他应确保调用超级版本的方法,请参阅UIContentContainer了解详细信息。

        1. 注释掉可能viewWillLayoutSubviews()视图控制器实现中的任何自定义代码。您也可以在viewWillLayoutSubviews()viewDidLayoutSubviews()之间检查您的框架。
        2. 修改

          您需要在主线程上执行选项卡更改。如果我是正确的你正在使用UIAlertView的代表?我不认为你在主线上打电话给你了!

                  dispatch_async(dispatch_get_main_queue(), ^{
                  [appDelegate.tabBarController setSelectedIndex:0];
              });