当前位置 > 主页 > 万和大讲堂 >


南京iOS培训答疑:iOS 开发该如何解决弹窗的设计问题?

2016-08-08 15:18

  iOS 开发该如何解决弹窗的设计问题?本文南京万和iOS培训和大家来分享一个在分享在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 的变化将被忽略掉。更多内容,请咨询南京万和iOS培训


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



  操作列表


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



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


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



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


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


  活动视图控制器


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


  不同于页面的行为,我发现表单把这个活动视图控制器展示为一个弹窗,弹窗将活动视图控制器展示在表单上。这是在 iOS 10 的新行为,iOS 9 里,是从另一个弹窗展示一个弹窗。更多内容,请咨询南京万和iOS培训


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


  结论


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


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


  想学iOS开发吗?那就来江苏万和计算机培训中心吧。江苏万和作为南京专业的iOS培训中心专门培养iOS移动开发人才,欢迎广大有志于此行业发展的学员们加入。

最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 开发课程基础班第四期
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 9月23日
  • 9月2日
  • 9月30日
  • 8月26日
  • 10月8日
  • 9月23日
  • 9月16日
  • 9月9日
  • 随时开课
  • 9月21日
  • 10月17日
  • 9月18日
  • 9月2日
  • 11月2日
  • 10月26日
  • 9月7日
  • ——
  • 随时开课
  • 9月26日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入