Photos是什么
Photos是苹果全新的照片框架,其要求最低版本为iOS8.利用Photos可以实现以下功能:
- 访问相册中的图片和视频
- 为照片(苹果APP)提供编辑扩展
- 访问iCloud上的图片和视频
权限
使用前一定要检查权限,使用如下方法:
switch PHPhotoLibrary.authorizationStatus() {
case .Denied:
// 用户拒绝,提示开启
case .NotDetermined:
// 尚未请求,立即请求
PHPhotoLibrary.requestAuthorization({ (status) -> Void in
if status == .Authorized {
// 用户同意
}
})
return false
case .Restricted:
// 用户无法解决的无法访问
case .Authorized:
// 用户已授权
}
获取资源
首先需要说明下PHFetchResult,所有fetch动作获取到的结果封装到这个类中.它里面可能是Asset,也可能是Collection.
1.获取全部照片
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] // 以创建时间排序
let allPhotos = PHAsset.fetchAssetsWithOptions(options) // 类型[PHAsset]
2.获取全部系统相册
let smartAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .AlbumRegular, options: nil) // 类型[PHAssetCollection]
3.获取全部用户相册
let topLevelUserCollections = PHAssetCollection.fetchTopLevelUserCollectionsWithOptions(nil) // 类型[PHAssetCollection]
4.获取单个资源
使用PHImageManager或其子类PHCachingImageManager用来加载资源.有一系列request方法可供选择.例如:
// options可用于限定获取质量和途径,以及进度回调等
PHCachingImageManager().requestImageForAsset(asset, targetSize: assetGridThumbnailSize, contentMode: .AspectFill, options: nil, resultHandler: { (image, info) in
// 获取到UIImage结果,info中包含了图片质量等信息
})
筛选条件
我们在fetch时可以使用PHFetchOptions用来筛选.
- predicate: 可用于匹配筛选
- sortDescriptors: 可用于排序
- includeHiddenAssets: 是否包含隐藏图片(默认false)
- includeAllBurstAssets: 是否包含连拍图片(默认false)
- includeAssetSourceTypes(iOS9+): 指定来源(iCloud,iTunes等)
- fetchLimit(iOS9+): 获取数量限制
- wantsIncrementalChangeDetails: 是否需要改善的细节(当收到Change通知时,稍后讲到,默认true)
PHPhotoLibraryChangeObserver
Photos允许我们监听相册改变的通知,首先我们需要注册监听:
PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
另外不要忘记在deinit时注销(或其他合适的时机):
deinit {
PHPhotoLibrary.sharedPhotoLibrary().unregisterChangeObserver(self)
}
实现PHPhotoLibraryChangeObserver协议只需一个方法
func photoLibraryDidChange(changeInstance: PHChange) {
if let changeDetails = changeInstance.changeDetailsForFetchResult(result) {
let updatedResult = changeDetails.fetchResultAfterChanges
// reload data
}
}
之前提到Options中的wantsIncrementalChangeDetails设为false时,获取的changeDetails的remove,insert,change和move的状态相关的参数均无法获取真正的值.
Photos是一个很大的框架,我们只谈论了如何获取图片,其实还有很多功能没有提到,有时间我会写一个续篇.