iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看363 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 363|回复: 1
收起左侧

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers

[复制链接]
3rdev 发表于 2016-8-11 00:46:07 | 显示全部楼层 |阅读模式
快来登录
获取最新的苹果动态资讯
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
iOS 9 的页面用了一种我们不能复现的方式去展示一个活动视图控制器,并且当从内部表单和弹窗呈现操作列表和活动视图控制器时 UIKit 的行为一开始看起来不那么连贯。我们提交了两份 Radars 给苹果:rdar://27448912 Can’t show activity view controller filling a form sheetrdar://27448488 Reading an alert controller’s popoverPresentationController property changes behavior

iOS 的人机交互指南声明:

不要在一个弹窗上展示一个模态视图。 由于一个警告弹窗可能是一个异常,所以不应该在这上面展现任何东西。极少数情况下,当你真的需要在一个动作导致弹窗后展示一个模态视图时,应该先把弹窗关闭掉再进行展示。

并且

一次只展示一个弹窗。 展示多个弹窗会让交互变得杂乱并让人产生疑惑。千万不要展示一个级联或者有层次结构的弹窗,一个从另一个里面产生的那种。如果你需要展示一个新的弹窗,首先关闭已经弹出的那个。

在横向水平的普通环境和全屏紧凑的环境下具有弹窗样式的视图控制器都应该呈现为弹窗。具有操作列表样式的 UIActivityViewController 和 UIAlertController 都遵守相同的规则:展示为弹窗或者一个上拉式表。所以如果一个弹窗展示一个活动视图控制器或者一个操作列表到底会发生什么?这个人机交互指南文档的说法好像有点矛盾。

在 iOS 9 页面的一个相关说明里,我们注意到在一个表单的视图控制器展示了一个填充了这个表单的 UIActivityViewController,想知道这是不是一个我们之前没有留意到的默认行为呢?又或者它是不是一个我们可以自定义实现的东西?

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 1

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 1

Screen shot of Pages on iPad showing an activity view controller presented as a sheet inside a form sheet

对于大多数视图控制器来说,在里面展示一个弹窗或者表单需要将当前视图控制器的 modalPresentationStyle 设置为 currentContext 或者 overCurrentContext。但对于某些像 UIActivityViewController 和 UIAlertController 这种 UIKit 提供的视图控制器来说,它们已经被赋予了自己的样式,modalPresentationStyle 的变化将被忽略掉。

一般,UIActivityViewController 会在常规宽度下展示为弹窗,在紧凑宽度下变成一个透明的表。但是如果一个常规宽度的视图控制器要从一个紧凑宽度的视图控制器里展示会怎么样呢?这种情况会在一个有表格或者弹窗 的 modalPresentationStyle 的视图控制器要在 iPad 上展示,或者它是一个使用了 overrideTraitCollection 属性的自定义展示控制器,然后这个控制器展示了一个 UIActivityViewController。

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 2

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 2

Diagram: First View Controller to Second View Controller to Activity View Controller or Action Sheet




1、操作列表

首先我们来看看 UIAlertController。图中根视图控制器(青色)用弹窗样式(下方,通过切分视图行为以作参考)展示了第二个用表单样式(上方)的视图控制器(粉色)。然后第二个视图控制器展示了一个操作列表样式的警告控制器。

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 3

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 3

Form sheet presenting action sheet as popover

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 4

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 4

Popover presenting action sheet as popover

虽然我们想要用列表的展示样式去展示操作列表(而不是弹窗),但因为关注点分离的优势,我设置了警告控制器的 popoverPresentationController.sourceView 和 popoverPresentationController.sourceRect,视图控制器不应该对它怎么展示作出假设。它应该在 app 的其他部分进行全屏展示,视图控制器不应该控制这些行为。

出于好奇,我尝试注释掉了popoverPresentationController的定义,发生了让我意想不到的情况:

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 5

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 5

Form sheet presenting action sheet as sheet

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 6

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 6

Popover presenting action sheet as sheet

原来只读取警告控制器的popoverPresentationController属性会导致即使是从一个紧凑宽度环境下呈现它也会展示为一个弹窗。如果你想这么做,请一定要确保好视图控制器展现的前后环境,因为如果你想从常规宽度的环境展现一个没有设置弹窗源码的警告控制器,UIKit 就会抛出一个异常。切记在展现触发的时候即使呈现视图控制器是在一个紧凑宽度环境下,当展示被激活的时候它还是有可能发生改变。

我提交了一个 rdar://27448488 Reading an alert controller’s popoverPresentationController property changes behavior




2、活动视图控制器

用UIActivityViewController做同样的事情,并指定弹窗源码信息,出现下面的情况:

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 7

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 7

Form sheet presenting activity view controller as a popover

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 8

iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers - 敏捷大拇指 - iOS 开发该如何解决弹窗的设计问题?Preventing Popovers on Popovers 8

Popover presenting activity view controller as a sheet

不同于页面的行为,我发现表单把这个活动视图控制器展示为一个弹窗,弹窗将活动视图控制器展示在表单上。这是在 iOS 10 的新行为,iOS 9 里,是从另一个弹窗展示一个弹窗。

用同样不访问popoverPresentationController的技巧导致 UIKit 抛出一个异常说“必须为这个弹窗提供位置信息”。




3、结论

我们发现当 UIKit 的视图控制器是从一个展示在常规宽度环境的紧凑宽度的环境中展示时行为会变得很混乱。弹窗展现的一般规则是在常规宽度下展示为弹窗,在紧凑宽度下为全屏(尽管结合当前上下环境更有意义)。操作列表和活动视图控制器的展示有点像弹窗的展示,但不要完全按照一般的规则来展示。

实际的行为看起来像是和人机交互指南说的一样,并很大程度上忽略了特征集合的 Size 类。UIKit 不会在操作列表的异常警告上展现一个弹窗。Size 类并不能控制所有的东西。

我们不能重现页面(Pages)的行为。对于我们来说,当一个表单展示一个活动视图控制器时,它将展示为弹窗。我把这个问题报告给了 Apple :rdar://27448912 Can’t show activity view controller filling a form sheet。如果你知道解决这个问题的方法,麻烦在我的 Twitter 留言




原文:Preventing Popovers on Popovers
作者:Douglas Hill
译者:llp0574

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

救世主 发表于 2016-8-15 22:21:58 | 显示全部楼层
弹弹弹,能不能在弹窗自身内部就处理好这种问题?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表