iOS-PhotoKit

作者: 博尔茨杰 | 来源:发表于2016-10-31 16:54 被阅读414次

    苹果API:https://developer.apple.com/reference/photos
    参考:http://www.jianshu.com/p/42e5d2f75452
    参考:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html

    首先简单介绍几个概念:

    PHAsset: 代表照片库中的一个资源,通过 PHAsset 可以获取和保存资源。
    PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值。
    PHFetchResult: 表示一系列的资源集合,也可以是相册的集合。
    PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)。
    PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格。
    PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数。


    ios8-photo-kit-1.png
    typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
        PHAssetCollectionTypeAlbum      = 1,//从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册(2-101)
        PHAssetCollectionTypeSmartAlbum = 2,//经由相机得来的相册(200-211)
        PHAssetCollectionTypeMoment     = 3,//Photos 为我们自动生成的时间分组的相册
    } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    /*
    之前看过几个篇其他的文章,有些人可能对PHAssetCollectionTypeAlbum(Albums can be created in the Photos app or appear on an iOS device through iTunes sync)
    和PHAssetCollectionTypeSmartAlbum(The Photos app displays built-in smart albums to group certain kinds of related assets)有些迷惑,我们只要看苹果的API的描述就可以了。
    
    PHAssetCollectionTypeAlbum是从iTunes同步或者用户自己在Photo App中建立的相册,它是可以删除的;
    PHAssetCollectionTypeSmartAlbum是把各个文件夹中的相片,通过不同的约束条件进行分类的,属于系统的操作,你会发现系统的相册是不能删除的。
    
    `PHAssetCollection` 类有个属性 `estimatedAssetCount`,可以用来快速获取该相册中的照片和视频的数量,但是在 PHAssetCollectionTypeSmartAlbum 上该属性永远为一个很大的数字(0),
    这个苹果官方API也有描述:`This count may not match the current number of assets in the collection. To get the most recent count, fetch the collection’s assets with the fetchAssetsInAssetCollection:options: method and read the count property of the fetch result.
    If asset count information is not available for the collection, this property’s value is NSNotFound.`
    `estimatedAssetCount`只能初略的统计相册和视频的数量,对于动态变化的相册是不能统计的,要用其他的方法去计算数量。
    */
    typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
        
        // PHAssetCollectionTypeAlbum regular subtypes
        PHAssetCollectionSubtypeAlbumRegular         = 2,//用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
        PHAssetCollectionSubtypeAlbumSyncedEvent     = 3,//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
        PHAssetCollectionSubtypeAlbumSyncedFaces     = 4,//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
        PHAssetCollectionSubtypeAlbumSyncedAlbum     = 5,//做了 AlbumSyncedEvent 应该做的事
        PHAssetCollectionSubtypeAlbumImported        = 6,//从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
        
        // PHAssetCollectionTypeAlbum shared subtypes
        PHAssetCollectionSubtypeAlbumMyPhotoStream   = 100,//用户的 iCloud 照片流
        PHAssetCollectionSubtypeAlbumCloudShared     = 101, //用户使用 iCloud 共享的相册
        
        // PHAssetCollectionTypeSmartAlbum subtypes
        PHAssetCollectionSubtypeSmartAlbumGeneric    = 200,//文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
        PHAssetCollectionSubtypeSmartAlbumPanoramas  = 201,//相机拍摄的全景照片
        PHAssetCollectionSubtypeSmartAlbumVideos     = 202,//相机拍摄的视频
        PHAssetCollectionSubtypeSmartAlbumFavorites  = 203,//收藏文件夹
        PHAssetCollectionSubtypeSmartAlbumTimelapses = 204,//延时视频文件夹,同时也会出现在视频文件夹中
        PHAssetCollectionSubtypeSmartAlbumAllHidden  = 205,//包含隐藏照片或视频的文件夹
        PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206,//相机近期拍摄的照片或视频
        PHAssetCollectionSubtypeSmartAlbumBursts     = 207,//连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
        PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208,//Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
        PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209,//这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
        PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210,//前置摄像头所拍摄的所有照片和视频
        PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211,//所有的截图
        
        // Used for fetching, if you don't care about the exact subtype
        PHAssetCollectionSubtypeAny = NSIntegerMax//包含所有类型
    } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    
    NSMutableArray *dataArray = [NSMutableArray array];
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];
    //检索的结果,subtype如果不选或者选错,系统会选择默认的类型
    PHFetchResult *smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:fetchOptions];
        
    //遍历相机胶卷
    [smartAlbumsFetchResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
            //过滤视频,只剩下相册
        if (![collection.localizedTitle isEqualToString:@"Videos"]) {
        }
    }];
        
        
    //遍历自定义相册
    PHFetchResult *smartAlbumsFetchResult1 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:fetchOptions];
        
        [smartAlbumsFetchResult1 enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
          //遍历返回的结果
    
    }];
    

    ***未完持续更新*****

    相关文章

      网友评论

        本文标题:iOS-PhotoKit

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