本文讲的是iOS 开发,该如何解决弹窗的设计问题?,

iOS 9 的页面用了一种我们不能复现的方式去展示一个活动视图控制器,并且当从内部表单和弹窗呈现操作列表和活动视图控制器时 UIKit 的行为一开始看起来不那么连贯。我们提交了两份 Radars 给苹果:rdar://27448912 Can’t show activity view controller filling a form sheet 和 rdar://27448488 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://27448488 Reading an alert controller’s popoverPresentationController property changes behavior.

活动视图控制器

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

 

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

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

结论

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

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





原文发布时间为:2016年07月28日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。

iOS 开发,该如何解决弹窗的设计问题?相关推荐

  1. 基于XCode IOS开发系统实现的新闻APP设计

    一.项目概述 1.1 项目介绍 本次课程设计所实现的新闻阅读APP是基于XCode IOS开发系统上开发的一款可以查看,收藏以及删除新闻的一款IOS应用软件.它有着启动界面.登录界面,在输入正确的账号 ...

  2. iOS开发 ---- 其他控件,弹窗,滑块,菊花,步进,分段等

    UIControlHub UISwitch 开关 1. 继承于UIControl 默认大小事79*27 2. 一般通过center属性来设位置 3. tintColor 边框的颜色 4. onTint ...

  3. 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?...

    (1)现象:普通情况下.储存数据以一个沙盒为单位,preference数据存在在沙盒路径下Library/Preferences里面,可是Xcode6里找来找去根本什么都没有. (2)原因:Xcode ...

  4. iOS开发之 简易随机点名册的设计

    效果图如下: 先看看定义的全局变量: <span style="font-size:14px;color:#666666;">{NSMutableArray *arrN ...

  5. ios开发之公交卡系统的设计与实现

    // // main.m // Bus-公交/*公交一卡通充值系统,有两种功能选择,第一种投入硬币或者纸币选择购票,第二种一卡通充值,充值面额是20,50,100*/ #import <Foun ...

  6. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课 ...

  7. iOS开发笔记--基于面向协议MVP模式下的软件设计

    传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面:  相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS ...

  8. iOS 开发设计常用软件及工具整理

    1, xCode 2, AppCode 3, Skech 原型设计软件 4, Hype 动画设计工具 5, fontawsome 免费图表 6, Prepo icon, images.catlog 生 ...

  9. 李洪强iOS开发之- 实现简单的弹窗

     李洪强iOS开发之- 实现简单的弹窗 实现的效果:  112222222222223333333333333333

最新文章

  1. robots.txt网站爬虫文件设置
  2. 局部线性嵌入(LLE)算法matlab可运行
  3. 无惧秋招,您的NLP算法工程师魔鬼训练计划请查收
  4. xampp mysql 内存溢出_php - SQLSTATE [HY000] [2002]连接被拒绝 - 堆栈内存溢出
  5. 阿里巴巴计算平台资深技术专家“一浪”对大数据领域近几年的技术趋势和变化的看法【强烈推荐数据岗细细品!】
  6. mysql中的运算符的执行顺序_【MySQL】执行顺序
  7. 设计模式行为模式_使用行为模式建立很棒的社区
  8. 一个博友的SQL问题解决过程
  9. 苹果该怎么办?特朗普誓言将会严厉惩罚外迁公司
  10. DTW(动态时间归整)算法的前世今生
  11. 复指数与高斯函数乘积的傅里叶变换_球谐光照——球谐函数
  12. 将Word文档转换成PPT教程
  13. 颈椎前路caspar撑开器_Mobi-C人工颈椎间盘在颈前路手术的临床应用
  14. 苏宁“北京攻略”:老阵地,新战场 | 一点财经
  15. Oracle以甲乙丙丁来排列
  16. VennDiagram 画文氏图/维恩图/Venn
  17. 微信开发--微信分享自定义图标和标题
  18. 神经网络与深度学习三:编写单隐层神经网络
  19. Mat—基础图像容器(OpenCV教程)
  20. Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)

热门文章

  1. 83)PHP,配置文件功能
  2. 使用SQL Server Management Studio 创建数据库备份作业
  3. android——数据库版本升/降级问题
  4. ASP.NET Web API 提升性能的方法实践
  5. nmon监控Linux服务器系统资源
  6. Android系统中震动功能的测试
  7. CSS样式(四)- CSS定位
  8. 中班音乐活动 机器人_【家门口的好幼儿园】玩转音乐,释放天性——岳阳幼儿园开展松江区骨干共同体名师二团实践研究活动...
  9. 智能判断图片中是否存在某物体_基于WT901传感器及NB-IOT无线技术开发的一款物体倾倒监测设备...
  10. python 计算时间、日期差值类