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

相关文章

  • #import <Photos/Photos.h>

    import  iOS图片 缩放、剪裁、自适应剪裁、保存到相册  从P...

  • iOS相册--Photos

    Photos是什么 Photos是苹果全新的照片框架,其要求最低版本为iOS8.利用Photos可以实现以下功能:...

  • iOS Photos相册

    参考连接 参考连接 导入 在plist文件中加入 Privacy - Photo Library Usage De...

  • iOS7,8,9下相册适配AssetsLibrary和Photo

    1.0 简介 iOS8及以后苹果将操作相册的ALAssetsLibrary framework替换为Photos ...

  • ### 仿小影图片选择

    项目准备 iOS-保存图片到自定义相册MSTImagePickerController利用Photos 框架搭建美...

  • iOS 视屏压缩

    iOS 8.0 相册使用的新的框架 Photos。 一、获取权限 二、获取视屏元数据 PHFetchResult ...

  • iOS之Photos/Photos.h库获取系统相册

    在iOS11中使用了系统photos库获取本地相册,可以先获取相册名再获取具体照片,同时可以访问系统分类相册和用户...

  • Photos框架快速了解

    Photos是iOS 8以上可使用的框架,通过此框架可以获取用户相册图片、livephoto、vidio下面是常用...

  • 聊聊ALAssetsLibrary 与 Photos

    ALAssetsLibrary和Photos都是Apple提供访问系统相册资源的两个标准库,前者在iOS9之后已经...

  • iOS 系统相册的使用

    使用的库 ios8 以前,使用的是 ,ios8以后,苹果推出了 现在一般使用photos库 针对系统相册的操作 ...

网友评论

    本文标题:iOS相册--Photos

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