1

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

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

我有一个通用应用程序,在 iPad 上,自定义UIPresentationController以部分模式显示导航,其宽度是屏幕宽度的一小部分。因此,我覆盖了'属性horizontalSizeClass上的 to compact ,因此在这个“半模态”中呈现的所有控制器都假定它们的 iPhone 布局。UIPresentationControlleroverrideTraitCollection

覆盖该大小类似乎会触发该错误。突然,当在那个“半模态”中弹出一个控制器时,动画在横向中被搞砸了(它要么向左要么向右跳跃)。

这是它的外观示例: 意外流行动画

尝试

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

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

  • 使用模态导航UINavigationControllerDelegate覆盖每个孩子的traitCollection开启 navigationController:didShowViewController:animated:- 这似乎没有什么区别
  • 让第一个导航孩子traitCollection 在推动它之前覆盖次要孩子

像这样:

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

有趣的是,这修复了弹出动画错误,但我的主控制器 ( self) 仍处于常规状态horizontalSizeClass......此外,这似乎是一种不好的做法。我的视图控制器不需要知道任何关于他们的演示的信息!这应该由 来处理,并且似乎受到演示控制器具有属性UIPresentationController的事实的支持。overrideTraitCollection

4

1 回答 1

2

原来罪魁祸首是 的实现supportedInterfaceOrientations,依赖于大小类:

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

因为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

于 2016-04-05T15:21:48.770 回答