iOS相册--Photos

作者: 李现科 | 来源:发表于2016-08-28 13:18 被阅读916次

    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

        本文链接:https://www.haomeiwen.com/subject/urvtettx.html