iOS相册--Photos

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是一个很大的框架,我们只谈论了如何获取图片,其实还有很多功能没有提到,有时间我会写一个续篇.

你可能感兴趣的:(iOS相册--Photos)