雷锋网按:本文由掘金翻译计划译者llp0574译自Douglas Hill《Preventing Popovers on Popovers》,校对者:yifili09、Graning。本文首发稀土掘金,未经允许,禁止转载。 iOS 9的页面用了一种本港台直播们不能复现的方式去展示一个活动视图控制器,并且当从内部表单和弹窗呈现操作列表和活动视图控制器时UIKit的行为一开始看起来不那么连贯。本港台直播们提交了两份Radars给苹果:Can't show activity view controller filling a form sheet 和 Reading an alert controller's popoverPresentationController property changes behavior. iOS的人机交互指南声明: 不要在一个弹窗上展示一个模态视图。 由于一个警告弹窗可能是一个异常,所以不应该在这上面展现任何东西。极少数情况下,当你真的需要在一个动作导致弹窗后展示一个模态视图时,应该先把弹窗关闭掉再进行展示。 并且 一次只展示一个弹窗。 展示多个弹窗会让交互变得杂乱并让人产生疑惑。千万不要展示一个级联或者有层次结构的弹窗,一个从另一个里面产生的那种。如果你需要展示一个新的弹窗,首先关闭已经弹出的那个。 在横向水平的普通环境和全屏紧凑的环境下具有弹窗样式的视图控制器都应该呈现为弹窗。具有操作列表样式的UIActivityViewController和UIAlertController都遵守相同的规则:展示为弹窗或者一个上拉式表。所以如果一个弹窗展示一个活动视图控制器或者一个操作列表到底会发生什么?这个人机交互指南文档的说法好像有点矛盾。 在iOS 9页面的一个相关说明里,本港台直播们注意到在一个表单的视图控制器展示了一个填充了这个表单的UIActivityViewController,想知道这是不是一个本港台直播们之前没有留意到的默认行为呢?又或者它是不是一个本港台直播们可以自定义实现的东西? 对于大多数视图控制器来说,在里面展示一个弹窗或者表单需要将当前视图控制器的modalPresentationStyle设置为currentContext或者overCurrentContext。但对于某些像UIActivityViewController和UIAlertController这种UIKit提供的视图控制器来说,它们已经被赋予了自己的样式,modalPresentationStyle的变化将被忽略掉。 一般,UIActivityViewController会在常规宽度下展示为弹窗,在紧凑宽度下变成一个透明的表。但是如果一个常规宽度的视图控制器要从一个紧凑宽度的视图控制器里展示会怎么样呢?这种情况会在一个有表格或者弹窗的modalPresentationStyle的视图控制器要在iPad上展示,或者它是一个使用了overrideTraitCollection属性的自定义展示控制器,然后这个控制器展示了一个UIActivityViewController。 操作列表首先本港台直播们来看看UIAlertController。图中根视图控制器(青色)用弹窗样式(下方,通过切分视图行为以作参考)展示了第二个用表单样式(上方)的视图控制器(粉色)。然后第二个视图控制器展示了一个操作列表样式的警告控制器。 虽然本港台直播们想要用列表的展示样式去展示操作列表(而不是弹窗),但因为关注点分离的优势,本港台直播设置了警告控制器的popoverPresentationController.sourceView和popoverPresentationController.sourceRect,视图控制器不应该对它怎么展示作出假设。它应该在app的其开奖直播部分进行全屏展示,视图控制器不应该控制这些行为。 出于好奇,本港台直播尝试注释掉了popoverPresentationController的定义,发生了让本港台直播意想不到的情况: 原来只读取警告控制器的popoverPresentationController属性会导致即使是从一个紧凑宽度环境下呈现它也会展示为一个弹窗。如果你想这么做,请一定要确保好视图控制器展现的前后环境,因为如果你想从常规宽度的环境展现一个没有设置弹窗源码的警告控制器,UIKit就会抛出一个异常。切记在展现触发的时候即使呈现视图控制器是在一个紧凑宽度环境下,当展示被激活的时候它还是有可能发生改变。 本港台直播提交了一个rdar:Reading an alert controller's popoverPresentationController property changes behavior. 活动视图控制器用UIActivityViewController做同样的事情,并指定弹窗源码信息,出现下面的情况: (责任编辑:本港台直播) |