Cocoa Touch 层概述

  • App ExtensionsHandOff 后继更新
  • 参照文档中的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的实现仅需要更少的代码和更简单操作就可以创建, 编辑, 显示和存储文本.

TextKitUIKit的新类, 以及对现有类的扩展来组成. 包含如下:

  • 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类.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,426评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 文|小新 我们第一次见面是在大学食堂,那应该是纯子刚入学的第一个月,我上大四,正处在大四的看大三的教大二的怎么...
    59b806b4f1b4阅读 304评论 0 0
  • 如果把活过的日子当做一生,我这一生都在看着别人的生活以求时光能够穿越,从未如愿却也改不了这种傻,他们说傻是天生的。...
    邹二狗阅读 501评论 0 0