导航流行动画意外 - 跳出屏幕

时间:2016-04-05 13:28:33

标签: ios uinavigationcontroller size-classes pop uitraitcollection

我遇到问题,我的UINavigationController默认弹出动画有意外行为 - 弹出的控制器有时会向左或向右跳出屏幕。

问题似乎与覆盖控制器的UITraitCollection

有关

我有一个通用应用程序,在iPad上有一个自定义UIPresentationController来显示部分模式中的导航,其宽度只是屏幕宽度的一小部分。因此,我在horizontalSizeClass UIPresentationController属性上覆盖overrideTraitCollection以压缩,因此所有控制器都显示在此" half modal"假设他们的iPhone布局。

覆盖该大小类似乎会触发该错误。突然间,当弹出一个控制器并在#34; half modal"中时,动画会在横向上混乱(它向左或向右跳跃)。

以下是它的外观示例: unexpected-pop-animation

尝试

首先,当我摆脱traitCollection覆盖时,bug就消失了。显然,我想覆盖水平尺寸类,因为这些视图也会在常规环境中的其他地方重复使用。

因此,我尝试以其他方式覆盖模态儿童的horizontalSizeClass,例如:

  • 使用模态导航UINavigationControllerDelegate覆盖 每个孩子的traitCollection开启 navigationController:didShowViewController:animated: - 这似乎毫无差别
  • 让第一个导航子项覆盖次要子项traitCollection 在它推之前

像这样:

[self.navigationController setOverrideTraitCollection:compactTraitCollection forChildViewController:secondaryController];
[self.navigationController pushViewController:secondaryController animated:YES];

有趣的是,这修复了pop动画错误,但是我的主控制器(self)仍处于常规horizontalSizeClass ...此外,这似乎是不好的做法。我的视图控制器不应该知道他们的演示文稿!这应该由UIPresentationController处理,并且似乎得到了表示控制器具有overrideTraitCollection属性......

的支持。

有没有人有这种奇怪的经历?#pop; pop"动画?我还没有找到任何东西......谢谢!

1 个答案:

答案 0 :(得分:2)

原来,罪魁祸首是supportedInterfaceOrientations的实施,依赖于大小等级:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    // Don't do this if you ever override size classes
    if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)
    {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

因为" half modal"的horizontalSizeClass控制器被覆盖以使用UIUserInterfaceSizeClassCompact,他们假设只有纵向方向。导航控制器不知道如何处理。

解决方案:

将上述代码更改为依赖于设备类型可以解决问题:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    // Basing off of size classes causes unexpected behavior when overriding size classes - use interface idiom instead
    if (self.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPhone)
    {
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

这可能应该是首先要做的事情,但鉴于Apple鼓励与设备无关,只依赖于规模等级,这不是我所做的。

无论如何,为了繁荣,这里是我用来调试的测试项目:https://github.com/bradgmueller/half-modal-test