-
App Extensions
与HandOff
后继更新 - 参照文档中的
Cocoa Touch Layer
章节进行理解翻译, 英语水平有限, 有不正确的地方请指出, 仅供参考!
cocoa Touch
层包含了构建iOS
应用的关键框架. 这些框架设定了应用的显示样式. 还提供了基本App的构造基础和对关键技术的支持, 如多线程, 基于触摸的输入, 推送通知, 和许多高层级的系统服务. 在设计应用时, 你应该优先调查Cocoa Touch
层中的技术是否满足你的需求.
High-Level Features | 高层级的功能
下面的章节描述了Cocoa Touch
层中的一些关键技术
Document Picker
Document picker
视图控制器允许用户访问应用沙盒外的文件. 它是一个在应用之间分享文档的简单机制. 还能够启用复杂的工作流以支持用户在多个应用之间编辑同一个文件.
Document picker
允许你访问来自多个Document providers
的文件. 比如, iCloud document providers
提供了访问保存在其它应用的iCloud
容器中的文件. 第三方开发者可以使用Storage Provider extension
来提供额外的Document providers
AirDrop
AirDrop
能让用户与附近的设备分享图片, 文档, 链接和其它类型的数据. 现有的UIActivityViewController
类中内置了使用AirDrop
发送文件到其它iOS设备的功能支持. 该类在分享你指定的内容时显示不同的选择. 如果你还没有使用该类, 应该考虑将它添加到界面中.
想接收使用AirDrop
发送的文件, 应用必须做如下操作:
- 在Xcode中声明合适的文件类型的支持. (Xcode添加合适的Key到App的Info.plist文件中) 系统使用该信息来判断你的App是否能打开该文件
- 在
App Deleagte
中实现application: openURL: sourceApplication: annotation:
方法 (接收到一个新文件时, 系统会调用该方法)
发送到应用的文件会保存在应用的Home
目录中的Document/Inbox
文件夹中. 如果你想要修改该文件, 你必须先将文件从该目录中移出. (系统只允许应用对该文件进行读取和删除操作). 如果设备当前锁屏, 则保存在该目录的文件都使用进行数据保护加密, 因此你必须为文件的不可访问做好准备.
TextKit
TextKit
是功能全面的, 高层级的一系列类, 用来处理文本和排版. 使用TextKit
, 你可以布局文本样式到段落, 列, 页面当中. 你可以围绕任意区域布局文字, 比如段落; 你也可以使用它来管理多种字体. 如果你考虑使用Core Text
实现文本渲染, 那你应该考虑使用TextKit
来替代. TextKit
集成了UIKit
中所有基于文本的控制, 使得应用相较之前iOS的实现仅需要更少的代码和更简单操作就可以创建, 编辑, 显示和存储文本.
TextKit
由UIKit
的新类, 以及对现有类的扩展来组成. 包含如下:
-
NSAttributedString
类被扩展了新属性的支持. -
NSLayoutManager
类生成符号布局文本. -
NSTextContainer
类限定文本布局的范围. -
NSTextStorage
类设定管理全文本内容的基础接口.
UIKit Dynamics
现在应用可以为UIView
对象和其它遵循了UIDynamicItem
协议的对象指定动态行为. (遵循该协议的对象称为dynamic items
). 动态行为通过合并现实世界的行为和特性到应用当中来提高用户体验. UIDynamic
支持如下行为:
-
UIAttachmentBehavior
对象(连接行为)指定两个dynamic item
或者dynamic item
与点之间的连接. 当一个item
(或者点)移动时, 附属的item
也会同样的移动. 然而连接并不是静态的. 一个附属行为拥有衰减和振动属性来决定其行为随着时间的改变. -
UICollisionBehavior
对象(碰撞行为)能让dynamic items
与其它item
或与该行为指定的边缘产生碰撞. 该行为还能让这些item
在碰撞中作出适当的反应. -
UIGravityBehavior
对象(重力行为)为dynamic items
指定了重力矢量.dynamic items
会在矢量方向进行加速, 直到与其它合适配置的item
或边缘发生碰撞. -
UISnapBehavior
对象(捕获行为)为dynamic item
指定了捕获点.item
会以配置好的效果被拉扯到该点上. 比如,dynamic item
能够像系在弹簧上那样被拉扯到点上.
当你将动态行为添加到animator
对象(UIDynamicAnimatorclass
的实例)时它就会生效. animator
提供了动态行为执行的上下文环境. 一个dynamic item
可以有多个行为, 但这些行为都必须由同一个animator
对象来执行动画
Multitasking
对于iOS
设备的用户而言, 电池续航时间是要顾及的重要因素. iOS中的multitasking
(多任务处理)模式就是在应用需要处理关键工作时才提供时间, 以此最大化电池续航而设计的. 当用户按下Home
键, 前台应用切换到后台执行环境. 如果应用不再需要工作, 它会被中断有效执行状态并进入freeze-dried
(冷冻)状态, 此时应用会保持在内存中但不会执行任何代码. 应用确实需要处理某类工作时, 可以向系统请求后台执行时间. 比如:
- 应用可以请求数量有限的时间来完成一些重要的任务.
- 支持特定服务的应用(比如音频播放)可以请求时间来提供这些服务.
- 应用可以使用本地通知在指定时间产生用户提醒, 不管应用是否在运行.
- 应用可以定期的从网络上下载数据.
- 应用可以在响应远程推送通知的操作里执行内容下载.
Auto Layout
自动布局
可以帮助你使用少量的代码实现动态的界面. 使用自动布局, 你会设定在用户交互界面如何布局多个元素的规则. 相比之前使用的Springs
(在Storyboard中以界面元素操作, 配合AutoResizing Mark)和Struts
(纯代码)模式, 这些规则表达了一大类关系并且使用起来更加直观. 比如, 你可以指定一个按钮总是距离它父视图左边缘20个像素点.
在自动布局中使用的实体是称为constraints
(约束)的Object-C
对象. 约束提供了数个优势:
- 仅需要替换字符串即可支持本地化, 而不是要求你更新约束.
- 为从右向左的语言提供了用户交互界面元素"映射"的功能, 如希伯来语和阿拉伯语
- 自动布局促进了在视图层的对象和控制层的对象之间职责的分离.
一个视图对象通常都有自身标准尺寸的值, 它在父视图中的位置的值, 它的位置与兄弟视图之间的关系值. 在一些非标准要求时视图控制器可以重写这些值.
Storyboards
使用Storyboard
来设计应用的用户交互界面是推荐的方式. Storyboard
能让你在一个地方设计整个应用的全部交互界面, 因此你可以看到所有的视图和视图控制器并理解它们之间是如何工作的. Storyboard
的一个重要部分是可以设置segues
(联线)的能力, 即可以从一个视图控制器过渡到另一个. 这些过渡允许你捕获用户交互界面除了内容之外的流动. 可以在Xcode设置这些过渡可见, 或者使用编程来初始化它们.
可以使用一个Storyboard
文件来保存应用里全部的视图和视图控制器, 或者使用多个视图的Storyboard
来管理界面的一部分. 为了更好的执行性能, Xcode
会在编译时获取Storyboard
文件的内容并将其划分为可以被单独加载的离散的块. 应用需要直接操作这些块. UIKit
框架提供了便利的类, 能在代码中访问Storyboard
的内容.
UI State Preservation
状态保存
为用户提供了仿佛应用一直都在运行的无缝体验, 即使实际上并非一直运行. 如果系统遇到内存压力, 它可能会平静的强制终止一或多个后台应用. 当一个应用从前台移动到后台时, 可以保存它的视图和视图控制器的状态. 在它的下次运行循环, 可以使用之前保存的状态信息来恢复它的视图和视图控制器到之前的配置, 使它看起来似乎并没有被退出过.
Apple Push Notification Service
推送通知服务
提供了一种提醒用户有新消息的新方式, 即使应用并非有效的运行着也能提醒. 使用该服务, 可以在任何时候推送文本通知, 给应用图标添加边缘数字, 或在设备触发可听的提示音. 这些消息能让用户知道他们应该打开应用来接收相关信息. 在iOS7后, 你甚至可以推送安静的通知来让你的应用知道有新的内容可以下载了.
从设计的观点看, 让推送通知
在iOS
应用上工作主要有两个部分. 第一, 应用必须请求通知
的传递并在通知
传递过来时进行数据处理. 第二, 你需要提供服务端处理来生成通知, 该处理存在于你的服务中, 并能对苹果远程推送服务
产生触发通知的作用.
Local Notification
通过为应用提供本地化生成通知
的方式来代替依赖外部服务的方式, 本地通知
补全了现有的推送通知
机制. 当重要事件发生时, 运行在后台的应用可以使用本地通知作为吸引用户注意的方式. 比如, 运行在后台的原生应用可以使用本地通知来提醒用户是时候要转弯了. 应用也可以安排本地通知在未来的日期和时间触发, 而且就算应用并没有在运行也能触发这些通知.
-
本地通知
的高级之处在于它们与你的应用是相互独立的. 在通知被安排后, 系统会管理它的递交. 当通知传递到达时, 你的应用甚至都不需要运行.
Gesture Recognizers
手势识别
能检测常见类型的手势, 比如在应用的视图上平滑和捏合. 它们与系统使用同样的触发机制来检测手势, 因此手势识别
为应用提供了一致的行为. 想使用时, 要为你的视图附加手势识别器
并给它指定手势触发时执行的事件. 手势识别器
能追踪原始的触摸事件
并它们构成预期手势时检测出来.
所有的手势识别器
都基于UIGestureRecognizer
类, 它定义了基本的行为. UIKit
提供了标准手势识别器的子类来识别taps
(点击), pinches
(捏合), pans
(平扫, 慢速), swipes
(轻扫, 快速), rotations
(旋转). 你也可以调整大部分手势识别器的行为来适应应用的需要. 比如, 你可以让点击手势识别器
来检测指定点击次数再触发响应事件.
Standard System View Controllers
许多系统框架为系统的标准界面定义了许多视图控制器. 可能的情况下, 尽量使用提供的视图控制而不是你自己创建的. 建议你在应用中使用这些视图控制器来呈现一致的用户体验. 当你需要执行一名多个下列任务时, 应该使用相关框架提供的视图控制器.
- 显示或编辑联系人信息, 使用
Address Book UI
框架提供的视图控制器. - 创建或编辑日历事件, 使用
EventKit UI
框架提供的视图控制器. - 写邮件或短信消息时, 使用
Message UI
框架提供的视图控制器. - 打开或预览一个文件的内容时, 使用
UIKit
框架提供的UIDocumentInteractionController
类. - 拍摄照片或者从用户的照片库中选择图片, 使用
UIKit
框架提供的UIImagePickerController
类. - 拍摄视频片段时, 使用
UIKit
框架提供的UIImagePickerController
类.