使用UIActivityViewController显示分享选项

如图所示,iOS内置了大量的分享选项,都构建于iOS的核心之中。用户可以在任何地方分析任意的内容。第三方应用(比如我们开发的应用)也能够利用iOS现有的全部分享能力,而无需考虑具体底层的服务以及iOS如何提供这些分享选项。整件事情的好处就在于,只需要提出想要分享什么,iOS会选出这些分享选项并且有能力处理好分享。例如,如果读者想分享图片或者文字,iOS会显示更多的选项。

fenxian01

在iOS中,分享数据是非常容易的事情,只需要实例化UIActivityViewController类,并且使用它的activityItems: applicationActivities: 初始化构造函数。这里介绍下该方法的参数:

  • activityItems:

一个包含了所有要分享内容的数组。数组的内容是任何类型的实例类,但需要实现UIActivityItemSource协议。

  • applicationActivities:

一个UIActivity类型的数组,代表了该应用所支持的分享活动。例如,可以在这里指明,应用程序是否可以处理它自己的图片和字符串分享。这里暂时只是简单地传入nil做为参数,告诉iOS使用系统默认的分享选项。

举个例子,假设有一个文本框,并且文本框的下面有一个分享按钮,用户可以输入文字并且分享。只需要简单地把文本框的文字传入到UIActivityViewController类的实例中即可。这里需要先确定文本框中有内容可分享,如果没有,则简单的显示一个警告视图告诉用户为什么不能分享文本框的内容。

下面把实现的代码贴出来。

Demo源代码:https://github.com/HuangJinyong/iOSDEV

警告视图或者操作列表

使用UIAlertController类可以创建警告视图和操作列表。

最简单的警告视图:

最简单的操作列表:

警告视图和操作列表都可以用UIAlertController类简单地创建出来。这个类提供了UIAlertController的实例,可以在其他的视图控制器中通过 present: animated flag: completion:方法将其展示出来。

创建警告视图或者操作列表通常包含以下步骤:

  1. 创建UIAlertController实例并且指定类型:是警告视图还是操作列表。
  2. 针对每个添加到警告视图或者操作列表的操作(“操作”通常表现为一个按钮),创建一个UIAlertAction类型的实现。
  3. 使用addAction:方法将新创建的UIAlertAction实力添加到警告控制器中。
  4. 到这一步,完事具备,只差显示了。在主视图控制器中调用present: animated flag: completion:方法。由于所有的UIViewController的子类都继承了present: animated flag: completion:方法,而且警告控制器本身也是UIViewController的一个子类,所有可以用这个方法将警告控制器像普通的视图控制器一样显示出来。

下面通过代码实现一个简单的警告视图,首先要做的是定义用来表示警告控制器的变量:

 

使用警告视图样式构造警告视图控制器

 

接下来创建操作:点击时,简单地讲文本打印到控制台。

 

把操作添加到警告控制器中。

 

当视图在屏幕显示之后,将警告控制器中持有的警告视图向用户展示。

 

有时候,在应用中需要让用户通过弹出对话框输入一些文本。比如,用户名或者一些ID之类的信息。使用警告控制器可以轻松解决这类问题,只需要调用警告控制器的addTextField:方法,向警告视图添加文本框。

 

然后,在构造的操作闭包中,通过警告视图的textFields属性访问文本框变量。它是一个文本框的数组,第0个元素就是我们想要的文本框(因为一共只添加了一个文本框)。

 

操作列表和警告视图非常相相似,只是显示的方式不同而且不支持添加文本框。此外,它们还包含一个概念-destructive(破坏性)按钮,在外观上有明显的区分。destructive按钮往往执行一些不可逆的操作,并终止警告视图和操作列表。

操作列表的代码实现基本一致,这里直接粘贴出来:

Demo源代码:https://github.com/HuangJinyong/iOSDEV

富文本

富文本是个好东西。许多程序员都有在UI中将混合样式的字符串显示在一行文本中的需求。比如,在一行文本中将“常规” “斜体”文字显示在一块,也就是说一个词是斜体而其余的是普通文本。或者还可能需要为一句话中的某个词设置下划线。对此,有些人可能会选择Web视图。但是,这绝不是一个最佳的选择,因为Web视图的渲染非常慢,会严重影响应用的性能。

构筑属性字符串的最佳方式就是使用NSMutableAttributedString类的init初始化方法,传入一个string字符串。其中NSMutableAttributedString是NSAttributedString的可变版本,调用后会得到一个属性字符串,但不包含任何属性。然后,为了给字符串中不同的部分设置属性 ,还需要调用NSMutableAttributedString类的setAttributes:range:方法,这个方法包含两个参数:

  • attrs:
    一个字典,它所有的键都是字符串类型,而每个键对应的值取决于键本身的内容。这里列举可用于设置字典的最重要的一些键值:

    • NSFontAttributeName: 这个键是UIFont类的实例,可以定义字符串某个区间的字体。
    • NSForegroundColorAttributeName:这个键是UIColor类的实例,可以定义字符串某个区间的文字颜色。
    • NSBackgroundColorAttributeName:这个键是UIColor类的实例,可以定义字符串某个区间的背景颜色。
    • NSShadowAttributeName: 这个键是NSShadow类的实例,可以定义字符串某个区间的阴影效果。
  • range:
    NSRange类型的值,定义了需要应用属性的字符串的起点和长度。

如果想要看到应用于该方法的全部键,只需要简单浏览苹果在线文档中对应的NSMutableAttributedString类的介绍。

通过例子,让我们深刻的理解富文本的神奇吧。如图所示:

通过观察,将实例拆分为两个属性字典,单词“iOS”对应的属性字典可以用如下代码构造出来:

 

同时,单词“SDK”可以这样构造:

 

将所有的东西放在一起,得到下面的代码,不仅创建了标签,还设置了属性文本:

Demo源代码:https://github.com/HuangJinyong/iOSDEV

键盘通知

在iOS开发过程中,监听键盘的弹出事件,修改对应的UI的改变,会使用户体验更加丰富。

当键盘显示或者消失时候,系统会发送相关的通知:

  • UIKeyboardWillShow:当键盘因屏幕上的任意组件(文本框、文本视图等)弹出时,由系统发出通知。
  • UIKeyboardDidShow:当键盘在屏幕上显示时,由系统发出通知。
  • UIKeyboardWillHide:当键盘即将隐藏时,由系统发出通知。
  • UIKeyboardDidHide:当键盘彻底隐藏时,由系统发出通知。

键盘通知中心包含一个字典,可以userInfo属性访问,它包含了键盘的矩形边界和动画信息等。该属性是一个NSDictionary类型。对于的key:

  • UIKeyboardFrameBeginUserInfoKey: 该键对应NSValue类型的值,该值包含了键盘起始时的矩形边界(CGRect)。
  • UIKeyboardFrameEndUserInfoKey:该键对应NSValue类型的值,该值包含了键盘终止时的矩形边界(CGRect)。
  • UIKeyboardAnimationDurationUserInfoKey:该键对应NSNumber类型的值,该值表示键盘显示和消失时动画的持续时间(Double)。
  • UIKeyboardAnimationCurveUserInfoKey: 该键对应NSNumber类型的值,该值表示键盘显示和消失时动画的执行节奏(UIViewAnimationCurve)。

例如,在UIKeyboardDidShow通知中的userInfo内容为:

 

UITextField文本框的常用方法

UITextField文本框是一种常见的信息输入机制,类似于Web表单中的表单字段。从显示文本的视觉来看,文本框与标签非常相似,只是文本框在运行时可以接受文本输入。

文本框只接受单行文本的输入和显示。因此,文本框的默认高度是系统定义的。在Interface Builder中,它的高度不能修改。但是如果使用代码创建文本框,则可以修改文本框的高度。虽然修改了高度,但是文本框内显示的文本行数不会改变,永远是显示一行。

UITextField文本框的常见属性

borderStyle属性:设置输入框的边框线样式。

background属性:设置一个背景图片

clearButtonMode属性:设置一个清空按钮,通过设置UITextFieldViewMode可以指定是否以及何时显示清除按钮。此属性主要有如下几种类型:

  • never:不显示清空按钮
  • whileEditing:内容不为空,且在编辑状态时(及获取焦点)显示清空按钮。
  • unlessEditing:内容不为空,且不在编辑状态时(焦点不在输入框上)显示清空按钮。
  • always: 内容不为空时,获得焦点与没有获得焦点都显示清空按钮。

textAlignment属性:该属性为NSTextAlignment类型,指定了文本框中文字的水平对齐方式。

placeholder属性:文本框是否显示占位符,默认是不显示。占位符指的是文本框在用户还没有输入内容之前显示的文字。当文本框内容为空时,占位符可以显示任何想要的文字,设置占位符可以帮助用户知晓当前文本框的用途。

text属性:这是一个读写属性,既可以读又可以写。读,可获取当前文本框中的文字;写,可以将文本框内容设置为想要的值。

delegate属性

文本框会向委托对象发送委托消息。在很多情况下都会发送消息,比如,当用户开始编辑文本框中的文字时,当用户在文本框中输入了任意文字(以任何方式修改了内容)时,当用户完成了编辑(焦点离开了文本框)时。

想得到这些消息通知,需要将接受消息的对象设置文本框的delegate属性,文本框的委托对象必须实现UITextFieldDelegate协议。

下面是部分方法在其被触发时的描述信息:

  • textFieldShouldBeginEditing:
    该方法放回BOOL值,告诉文本框(该方法的参数)是否应该开始被用户编辑。如果不想让用户编辑,则返回false。一旦用户点文本框,企图编辑内容,该方法就会被触发(假设文本框不是只读状态)。
  • textFieldDidBeginEditing:
    该方法在文本框开始被用户编辑后触发。当用户已经点击了文本框,并且textFieldShouldBeginEditing:委托方法返回了true时(告诉文本框,用户可以编辑内容),会触发当前方法。
  • textFieldShouldEndEditing:
    该方法返回BOOL值,告诉文本框当前的编辑会话是否可以结束。这个方法在用户准备离开文本框或者活动焦点切换到其他数据入口时触发。如果这个方法返回false,用户则无法切换到其他文本输入入口,并且键盘会一直出现在屏幕中。
  • textFieldDidEndEditing:
    该方法在文本框的编辑会话结束后触发。这通常发生在用户决定去编辑其他数据输入,或者在用户使用了应用提供的某个按钮将键盘隐藏的时候。
  • textField:shouldChangeCharactersIn range: replacementString:
    该方法在文本框中所包含的文字发生改变时候触发。改方法返回布尔值。如果返回true,表示同意文字的变化。如果返回false,则表示文本框中文字的变化不回被确认且不会发生改变。
  • textFieldShouldClear:
    每个文本框都包含一个清除按钮,通常是一个圆形的X按钮。当用户按下这个按钮时,文本框的内容会自动清空。需要手工开启清除按钮。如果开启了清除按钮,但是却在该方法中返回了false值,则会给用户留下该应用根本不能正确工作的印象。因此,请确保知道自己做了什么。如果用户看到了清除按钮,按下后却发现文本框的内容没有清除,那体验是相当糟糕的。
  • textFieldShouldReturn:
    当用户按下回车/换行键,尝试隐藏键盘时触发该方法。需要将文本设置为当前程序焦点。

下面通过一个文本框的小Demo练习下上面学习到的知识。在文本框下面创建一个动态文字标签。我们打算在标签中显示文本框的字母个数。具体效果如图:

 

我们先将要实现的控件创建出来,并将上面学到的知识根据需求进行配置。

 

定义一个方法,对文本框的字母个数进行计算并显示到label标签上

 

我们实现UITextFieldDelegate代理中的textField:shouldChangeCharactersIn range: replacementString:方法,当文本框内容发生改变时,就会发送来委托信息。通过监听这个方法实现实时计算文本框字母个数的目的。

这里的replacementString string参数指明了用户在文本框中输入的字符串。shouldChangeCharactersIn range参数指明了文本框中用户输入文字的位置。使用这两个参数,首先应创建一个字符串读取当前文本框的文字内容,然后在给定的区间内,用新的文字替换旧的。

Demo源代码:https://github.com/HuangJinyong/iOSDEV

leftView和rightView

除此之外,文本框包含两个非常优雅的属性,分别是leftView和rightView。它们都是UIView类型的属性,可读可写。正如它们的名字所暗示的,如果将一个视图赋值给该属性,这个视图将显示在文本框的左侧或者右侧。例如:可以在左侧视图使用UILable显示用户当前的国家的货币符号。

 

如果将一个视图赋值给文本框的左视图或者右视图,这些视图默认是不会自动显示,它们何时显示取决于它们的外观模式。可以通过leftViewMode和rightViewMode属性分别进行调整。

简单实现明暗码切换的TextField功能

UITextField文本框是一种常见的信息输入机制,类似于Web表单中的表单字段。iOS9系统自带的UITextField在切换到暗码时会清除之前的输入文本,下面就简单扩展一下UITextField,封装一个实现明暗码的切换的小控件。

功能实现原理很简单,我们通过在通知中心添加观察者的方法,对文本框的输入状态进行监听;通过重写UITextField的 isSecureTextEntry 属性实现对文本框进行二次监听(这里将获取一次键盘焦点定义为一次监听)。

首先我们定义几个变量,用途见备注。

 

重写UITextField的 isSecureTextEntry 属性实现对文本框进行二次监听,当切换明暗码后,重新调用文本框监听。

 

对文本输入框进行监听,当切换明暗码后,重新输入,会先将缓存的密码进行还原,再在后面追加新输入的字符,从而实现不清除之前输入的文本的目的。

 

最后别忘记移除通知哦,否则会有内存泄漏等情况发生。

 

至此整个逻辑功能完成,附上效果图

源代码:https://github.com/HuangJinyong/iOSDEV

简单了解iOS技术层

Apple 以一系列层的方式来描述iOS实现的技术,其中每层都由可在应用程序中使用的不同框架组成。我们了解iOS技术层,有助于系统的学习iOS开发。

201610121321720131012212437484.png

我们来简单了解下各层中比较有趣的框架。如果想全面了解所以的框架,可以在Apple Xcode文档中使用层名进行搜索。

Cocoa Touch层

Cocoa Touch层是iOS多个服务成中最高层,Cocoa Touch层有多个框架组成,它们为应用程序提供核心功能(包括多任务和广告功能)。在这些框架中,UIKit它提供的功能比起名称中的UI按时的多得多。

1. UIKit

UIKit提供了大量的功能。它负责启动和结束应用程序、控制界面和多点触摸事件,并让你能够访问常见的数据视图(如网页以及word和Excel文档等)。

UIKit还负责iOS内部的众多集成功能。访问多媒体库、照片库和加速计也是使用UIKit中的类和方法来实现的。

2. MapKit

MapKit框架让开发人员能够在任何应用程序中添加Aplle地图视图,这包括标注、定位和事件处理功能。

3. GameKit

GameKit框架进一步提高了iOS应用程序的网络交互性。GameKit提供了创建并使用对等网络的机制,这包括会话发现、仲裁和语音聊天。可将这些功能加入到任何应用程序中,而不仅仅是游戏中。

4. Message UI/Contacts UI/EventKit UI

Apple深谙用户对iOS应用程序之间的集成需求。框架Message UI、Contacts UI、EventKit UI让你能够在任何应用程序中访问电子邮件、联系人、日历事件。

5. Notification Center

使用Notification Center框架在iOS通知中心中创建小部件并显示信息。

6. iAd

iAd框架支持在应用程序中加入广告。iAd是交互式广告组件,使用简单的拖放操作就可以将其加入到软件中。在应用程序中,你无须管理iAd交互,这些工作由Apple完成。

7. TextKit

TextKit提供了大量富文本渲染功能,让iOS应用程序能够实现类似于字处理程序的排版和字体控制功能。TextKit提供了编辑、显示和保存富文本内容的功能。

多媒体层

当Apple设计计算设备时,已经考虑到了多媒体功能。iOS设备科创建复杂的图形、播放音频和视频、甚至可生成实时的三维图形。这些功能都是由多媒体层中的框架处理的。

1. AV Foundation

AV Foundation框架可用于播放和编辑复杂的音频和视频。该框架应用于实现高级功能,如电影录制、音轨管理和音频平移。

2. AVKit

AVKit框架用于简单的视频播放;在iOS9或者更高的版本中,它还用于支持画中画。

3. Core Audio

Core Audio框架提供了在iPhone中播放和录制音频的方法;它还包含AudioToolbox框架和AudioUnit框架,其中前者可用于播放警报声或导致短暂震动,而后者可用于处理声音。

4. Core Image

使用Core Image框架,开发人员可在应用中添加高级图像和视频处理功能,而无需它们后面复杂的计算。例如,Core Image提供了人脸识别和图像过滤功能,可轻松地将这些功能添加到任何应用程序中。

5. Core Graphics

通过使用Core Graphics 框架,可在应用程序中添加2D绘画和合成功能。

6. Core Text

对iPhone 屏幕上显示的文本进行精确的定位和控制。应将Core Text 用于移动文本处理应用程序和软件中,它们需要快速显示和操作显示高品质的样式化文本。

7. Game Controller

虽然与多媒体没有直接关系,Game Controller 也是多媒体层的一员。这个框架让你能够查找、连接并配置通过了Apple MFi(Made For iPhone)认证的游戏控制器。

8. Image I/O

Image I/O 框架可用于导入和导出图形数据和图像元数据,这些数据可以iOS支持的任何文件格式存储。

9. Metal

Apple 新推出的高性能图形框架。不同于OpenGL,Metal提供了低级得多的图形硬件访问,让开发者能够在应用程序中实现更高品质的视觉效果。

10. OpenGL ES

OpenGL ES 是深受欢迎的OpenGL 框架的子集,适用于嵌入式系统(ES)。OpenGL ES 可用于在应用程序中创建2D 和3D 动画。要使用OpenGL,除了Swift 知识外还需其他开发经验,但可为手持设备生成神奇的场景—类似于流行的游戏控制台。

11. Photos

Photos 框架让你能够访问存储在iOS 图库(包括iCLoud 图库)中的照片。使用这个框架可创建用于管理和编辑照片的iOS应用程序。

12. PhotosUI

通过创建自定义编辑功能来扩展“照片”应用程序的功能,可用于扩展内置的iOS图像编辑器。

13. SpriteKit

SpriteKit 框架提供了一组简单的工具,用于在2D 游戏中制作动画。SpriteKit包含动画、碰撞检测和对象逻辑控制。如果你要开发超级玛利那样的游戏,SpriteKit是一个不错的选择。

14. Quartz Core

Quartz Core 框架用于创建这样的动画,即它们将利用设备的硬件功能。这包括被称为 Core Animation的功能集。

核心服务层

核心服务层用于访问地接的操作系统服务,如文件存取、iCloud存储、联网和众多常见的数据对象类型。你将通过Foundation 框架经常使用核心服务。

1. Accounts

鉴于其始终在线的特征,iOS设备经常用于存储众多不同服务的账户信息。Accounts 框架简化了存储账户信息以及对用户进行身份验证的过程。

2. Address Book

Address Book 框架用于直接访问和操作地址薄。该框架用于在应用程序中更新和显示通信录。

3. CFNetwork

CFNetWork让你能够访问BSD套接字、HTTP、和FTP协议请求以及Bonjour发现。

4. Core Data

Core Data框架可用于创建iOS应用程序的数据模型,它提供了一个基于SQLite的关系数据库模型,可用于将数据绑定到界面对象,从而避免使用代码进行复杂的数据操纵。

5. Core Foundation

Core Foundation 提供的大部分功能与Foundation框架相同,但它是一个过程型框架,因此需要采用不同的开发方法,这些方法的效率比Swift面向对象模型低。除非绝对必要,否则应避免使用Core Foundation。

6. Core Location

Core Location框架可用于从iPhone和iPad(3G/LTE)的GPS(非3G/LTE设备支持基于WIFI的定位服务,但精度要低得多)获取经度和纬度的信息以及测量精度。

7 Core Motion

Core Motion框架管理iOS平台中大部分与运动相关的事件,如使用加速计和陀螺仪。

8. EventKit

EventKit 框架用于访问储存在iOS设备中的日历信息,还让开发人员能够在日历中新建事件,包括闹钟。

9. Foundation

Foundation框架提供了一个面向对象封装器,其中封装了 Core Foundation的功能。操作字符串、数组和字典等都是通过Foundation框架进行的,还有其他必须的应用程序功能也如此,如管理应用程序首选项、线程和本地化。

10. HealthKit

HealthKit框架用于储存和访问与iOS设备用户的健康状况相关的数据。如果你要开发与塑身相关的应用程序,这个框架正是为你提供的。

11. HomeKit

HomeKit框架提供了访问家住自动化硬件和工具的统一见面。使用这个框架可访问自动功能,但需要额外的硬件和软件。

12. Newsstand

使用这个框架创建数字媒体期刊,如报纸或杂志。框架Newsstand支持自动内容更新,让用户无需手动更新就能看到最新的内容。

13. PassKit

通过结合使用框架PassKit和Web服务,可向用户提供电子优惠券、电子登机牌、电子门票和其他交易信息。

14. Quick Look

Quick Look框架在应用程序中实现文件浏览功能,即使应用程序不知道如何打开特定的文件类型。这旨在浏览下载到设备中的文件。

15. Social

Apple提供了一个针对流行社交网站的框架,开发人员无需从零开始创建Twitter和Facebook集成。通过使用Social框架,可编写访问Twitter和Facebook的应用程序,而无需管理账户信息,也不用了解Twitter和Facebook的专用网络协议。

16. StoreKit

StoreKit框架让开发人员能够在应用程序中创建购买事务,而无需退出程序。所有交互都是通过App Store进行的,因此无需通过StoreKit方法请求或传输金融数据。

17. System Configuration

System Configuration框架用于确定设备网络配置的当前状态:连接的是哪个网络?哪个设备可达?

核心OS层

核心OS层是由最底层级的iOS服务组成,这些功能包括线程、复杂的数学运算、硬件配件和加密。需要访问这些框架的情况很少。

1. Accelerate

Accelerate框架简化了计算和大数操作任务,这包括数字信号处理功能。

2. Core Bluetooth

框架Core Bluetooth让你能够连接到低功耗蓝牙设备。这是一类独特的蓝牙外设,通信功率要求很低。

3. External Accessory

External Accessory框架用于开发到配件的接口,这些配件是基座接口或蓝牙连接的。

4. Local Authentication

Local Authentication框架提供了通过密码或Touch ID传感器对用户进行身份验证的功能。

5. Security

Security框架提供了执行加密(加密/解密数据)的函数,这包括与iOS密匙链交互以添加、删除和修改密匙项。

6. System

System框架让开放任用能够访问不受限制的UNIX开环境中的典型工具。

送别

短暂的相聚,你又要回北京为考研冲刺,虽然依依不舍,也要微笑挥手送别。

很高兴你能找到兴趣点和方向,为之努力着。

人有时候需要经历一段孤独和磨练。

一起加油,即是送别,也是共勉。

 

Photos.framework的学习笔记

Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.framework的获取相册资源的原生库。

提醒一下,要使用相册资源库的时候,不要忘记在info.plist文件中加NSPhotoLibraryUsageDescription这个描述字段,避免权限问题导致模拟器崩溃。

学习一个库或者框架,我们要缕清总体逻辑,下面是一些对Photos框架的理解:

资源类

  • PHPhotoLibrary:是一个资源库。能够获取相册的权限以及对相册的操作,与AssetsLibrary.framework不同,它不能获取资源对象。
  • PHAsset:是一个独立的资源对象。可以通过类方法对PHCollection对象进行遍历,获得存放Asset对象的结果集,可以直接获得资源的规格数据,若想获得图片以及原图等资源,需要配合PHImageManager对象,继承自PHObject。
  • PHFetchResult:是一个结果集,一个泛型类。通过方法获取到的相册或者资源组就是被封装成该类返回。
  • PHAssetCollection:是一个资源集合对象。其实它就是一个相册的概念,可通过类方法获得想要的相册集合,继承自PHCollection。
  • PHCollectionList:是一个资源集合列表对象。刚接触时以为它是存放PHCollection对象的集合,后来才知道,如果想要通过地点以及时间分组的话,请使用这个类替代PHAssetCollection吧,用法与PHAssetCollection类似,同样是继承自PHCollection。

工具类

  • PHFetchOptions: 一个遍历配置类。一般情况下,当存在遍历方法的时候就存在这个类型的参数,里面含有谓词、遍历顺序等属性,可以通过设置这些熟悉,完成不同的遍历。
  • PHImageManager:是一个负责渲染资源的类。比如获取PHAsset对象的原图等操作需要使用该类。
  • PHCachingImageManager:继承PHImageManager,可以对请求的资源对象进行缓存,这样再次获取时就不需要重新渲染,在加快获取速度的同时也降低了CPU的压力,这里最好对缓存的PHImageRequestID进行一下记录,防止同一个资源被无限缓存的尴尬。
  • PHImageRequestOptions:是一个资源请求的配置类。通常在使用PHImageManager对某个资源进行请求时都会存在此类型的参数,可以在请求资源时对该对象进行配置,获取想要的结果,比如原图。

请求类

请求类不能独立使用,要想发挥作用,需要与PHPhotoLibrary对象配合使用。

  • PHAssetCollectionChangeRequest:集合变化请求类,负责对PHAssetCollection对象的操作。
  • PHCollectionListChangeRequest:集合变化请求类,负责PHCollectionList对象的操作。
  • PHAssetChangeRequest:资源变化请求类,负责PHAsset对象的操作。
对Photo.framework的总体逻辑大概理解后,结合小demo对类库中的类及其属性方法进行详解:

PHPhotoLibrary

待续…