我遇到问题,我的UINavigationController
默认弹出动画有意外行为 - 弹出的控制器有时会向左或向右跳出屏幕。
问题似乎与覆盖控制器的UITraitCollection
。
我有一个通用应用程序,在iPad上有一个自定义UIPresentationController
来显示部分模式中的导航,其宽度只是屏幕宽度的一小部分。因此,我在horizontalSizeClass
UIPresentationController
属性上覆盖overrideTraitCollection
以压缩,因此所有控制器都显示在此" half modal"假设他们的iPhone布局。
覆盖该大小类似乎会触发该错误。突然间,当弹出一个控制器并在#34; half modal"中时,动画会在横向上混乱(它向左或向右跳跃)。
尝试
首先,当我摆脱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"动画?我还没有找到任何东西......谢谢!
答案 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