| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 | 
							- //
 
- //  HXPhotoModel.h
 
- //  HXPhotoPickerExample
 
- //
 
- //  Created by Silence on 17/2/8.
 
- //  Copyright © 2017年 Silence. All rights reserved.
 
- //
 
- #import <Foundation/Foundation.h>
 
- #import "HXPhotoTypes.h"
 
- @class HXPhotoManager;
 
- @class HXPhotoEdit;
 
- @class HXAssetURLResult;
 
- @interface HXPhotoModel : NSObject<NSCoding>
 
- /// 创建日期
 
- /// 如果是通过相机拍摄的并且没有保存到相册(临时的) 为当前时间([NSDate date])
 
- @property (strong, nonatomic) NSDate * _Nullable creationDate;
 
- /// 修改日期
 
- /// 如果是通过相机拍摄的并且没有保存到相册(临时的) 为当前时间([NSDate date])
 
- @property (strong, nonatomic) NSDate * _Nullable modificationDate;
 
- /// 位置信息 CLLocation 对象
 
- /// 通过相机拍摄的时候有定位权限的话就有值
 
- @property (strong, nonatomic) CLLocation * _Nullable location;
 
- /// 照片类型
 
- @property (assign, nonatomic) HXPhotoModelMediaType type;
 
- /// 照片子类型
 
- @property (assign, nonatomic) HXPhotoModelMediaSubType subType;
 
- @property (assign, nonatomic) HXPhotoModelMediaTypeCameraPhotoType cameraPhotoType;
 
- @property (assign, nonatomic) HXPhotoModelMediaTypeCameraVideoType cameraVideoType;
 
- /// PHAsset对象
 
- @property (strong, nonatomic) PHAsset * _Nullable asset;
 
- /// 照片格式
 
- @property (assign, nonatomic) HXPhotoModelFormat photoFormat;
 
- /// 视频秒数
 
- @property (nonatomic, assign) NSTimeInterval videoDuration;
 
- /// 选择的下标
 
- @property (assign, nonatomic) NSInteger selectedIndex;
 
- /// 模型所对应的选中下标
 
- @property (copy, nonatomic) NSString * _Nullable selectIndexStr;
 
- /// 照片原始宽高
 
- @property (assign, nonatomic) CGSize imageSize;
 
- /// 本地视频URL / 网络视频地址
 
- /// 系统相册的资源(PHAsset不为nil的)需要通过exportVideoWithPresetName...方法获取
 
- @property (strong, nonatomic) NSURL * _Nullable videoURL;
 
- /// livephoto - 网络视频地址
 
- @property (strong, nonatomic) NSURL * _Nullable livePhotoVideoURL;
 
- /// 网络图片的地址
 
- @property (copy, nonatomic) NSURL * _Nullable networkPhotoUrl;
 
- /// 网络图片缩略图地址
 
- @property (strong, nonatomic) NSURL * _Nullable networkThumbURL;
 
- /// 网络图片的大小
 
- //@property (assign, nonatomic) NSUInteger networkImageSize;
 
- /// 临时的列表小图 - 本地图片才用这个上传
 
- /// 获取图片请使用 request相关方法
 
- @property (strong, nonatomic) UIImage * _Nullable thumbPhoto;
 
- /// 临时的预览大图  - 本地图片才用这个上传
 
- /// 获取图片请使用 request相关方法
 
- @property (strong, nonatomic) UIImage * _Nullable previewPhoto;
 
- /// 图片本地地址
 
- /// 正常情况下为空
 
- /// 1.调用过 requestImageURLStartRequestICloud 这个方法会有值
 
- /// 2.HXPhotoConfiguration.requestImageAfterFinishingSelection = YES 时,并且选择了原图或者 tpye = HXPhotoModelMediaTypePhotoGif 有值
 
- @property (strong, nonatomic) NSURL * _Nullable imageURL;
 
- #pragma mark - < Disabled >
 
- /// 是否正在下载iCloud上的资源
 
- @property (assign, nonatomic) BOOL iCloudDownloading;
 
- /// iCloud下载进度
 
- @property (assign, nonatomic) CGFloat iCloudProgress;
 
- /// 下载iCloud的请求id
 
- @property (assign, nonatomic) PHImageRequestID iCloudRequestID;
 
- /// 预览界面导航栏上的大标题
 
- @property (copy, nonatomic) NSString * _Nullable barTitle;
 
- /// 预览界面导航栏上的小标题
 
- @property (copy, nonatomic) NSString * _Nullable barSubTitle;
 
- /// PHAsset对象唯一标示
 
- @property (copy, nonatomic) NSString * _Nullable localIdentifier;
 
- /// 是否iCloud上的资源
 
- @property (nonatomic, assign) BOOL isICloud;
 
- /// 当前照片所在相册的名称
 
- @property (copy, nonatomic) NSString * _Nullable albumName;
 
- /// 视频时长
 
- @property (copy, nonatomic) NSString * _Nullable videoTime;
 
- /// cell是否显示过
 
- @property (assign, nonatomic) BOOL dateCellIsVisible;
 
- /// 是否选中
 
- @property (assign, nonatomic) BOOL selected;
 
- /// 预览界面按比例缩小之后的宽高
 
- @property (assign, nonatomic) CGSize endImageSize;
 
- /// 3dTouch按比例缩小之后的宽高
 
- @property (assign, nonatomic) CGSize previewViewSize;
 
- /// 预览界面底部cell按比例缩小之后的宽高
 
- @property (assign, nonatomic) CGSize dateBottomImageSize;
 
- /// 拍照之后的唯一标示
 
- @property (copy, nonatomic) NSString * _Nullable cameraIdentifier;
 
- /// 当前图片所在相册的下标
 
- @property (assign, nonatomic) NSInteger currentAlbumIndex;
 
- /// 网络图片已下载的大小
 
- @property (assign, nonatomic) NSInteger receivedSize;
 
- /// 网络图片总的大小
 
- @property (assign, nonatomic) NSInteger expectedSize;
 
- /// 网络图片是否下载完成
 
- @property (assign, nonatomic) BOOL downloadComplete;
 
- /// 网络图片是否下载错误
 
- @property (assign, nonatomic) BOOL downloadError;
 
- /// 视频当前播放的时间
 
- @property (assign, nonatomic) NSTimeInterval videoCurrentTime;
 
- /// 当前资源的大小 单位:b 字节
 
- /// 网络图片/视频为0
 
- @property (assign, nonatomic) NSUInteger assetByte;
 
- @property (assign, nonatomic) BOOL requestAssetByte;
 
- /// 编辑的数据
 
- /// 传入之前的编辑数据可以在原有基础上继续编辑
 
- @property (strong, nonatomic) HXPhotoEdit * _Nullable photoEdit;
 
- /// 是否隐藏选择按钮
 
- @property (assign, nonatomic) BOOL needHideSelectBtn;
 
- /// 如果当前为视频资源时的视频状态
 
- @property (assign, nonatomic) HXPhotoModelVideoState videoState;
 
- @property (copy, nonatomic) NSString * _Nullable cameraNormalImageNamed;
 
- @property (copy, nonatomic) NSString * _Nullable cameraPreviewImageNamed;
 
- @property (assign, nonatomic) BOOL loadOriginalImage;
 
- /// 临时图片
 
- @property (strong, nonatomic) UIImage * _Nullable tempImage;
 
- #pragma mark - < init >
 
- /// 通过image初始化
 
- /// @param image UIImage
 
- + (instancetype _Nullable)photoModelWithImage:(UIImage * _Nullable)image;
 
- /// 通过视频地址和视频时长初始化
 
- /// @param videoURL 视频地址
 
- /// @param videoTime 视频时长
 
- + (instancetype _Nullable)photoModelWithVideoURL:(NSURL * _Nullable)videoURL videoTime:(NSTimeInterval)videoTime;
 
- /// 通过本地视频地址URL对象初始化
 
- /// @param videoURL 本地视频地址URL
 
- + (instancetype _Nullable)photoModelWithVideoURL:(NSURL * _Nullable)videoURL;
 
- /// 通过PHAsset对象初始化
 
- /// @param asset PHAsset
 
- + (instancetype _Nullable)photoModelWithPHAsset:(PHAsset * _Nullable)asset;
 
- /// 通过视频PHAsset对象初始化视频封面
 
- /// @param asset PHAsset
 
- + (instancetype _Nullable)videoCoverWithPHAsset:(PHAsset * _Nullable)asset;
 
- /// 通过网络图片URL对象初始化
 
- /// @param imageURL 网络图片URL
 
- + (instancetype _Nullable)photoModelWithImageURL:(NSURL * _Nullable)imageURL;
 
- + (instancetype _Nullable)photoModelWithImageURL:(NSURL * _Nullable)imageURL thumbURL:(NSURL * _Nullable)thumbURL;
 
- /// 网络视频初始化
 
- /// @param videoURL 网络视频地址
 
- /// @param videoCoverURL 视频封面地址
 
- /// @param videoDuration 视频时长
 
- + (instancetype _Nullable)photoModelWithNetworkVideoURL:(NSURL *_Nonnull)videoURL
 
-                                           videoCoverURL:(NSURL *_Nonnull)videoCoverURL
 
-                                           videoDuration:(NSTimeInterval)videoDuration;
 
- /// 通过本地图片和视频生成本地LivePhoto
 
- /// @param image 本地图片
 
- /// @param videoURL 本地视频地址
 
- + (instancetype _Nullable)photoModelWithLivePhotoImage:(UIImage * _Nullable)image
 
-                                               videoURL:(NSURL * _Nullable)videoURL;
 
- /// 通过网络图片和视频生成本地LivePhoto
 
- /// @param imageURL 网络图片地址
 
- /// @param videoURL 网络视频地址
 
- + (instancetype _Nullable)photoModelWithLivePhotoNetWorkImage:(NSURL * _Nullable)imageURL
 
-                                               netWorkVideoURL:(NSURL * _Nullable)videoURL;
 
- /// 判断两个HXPhotoModel是否是同一个
 
- /// @param photoModel 模型
 
- - (BOOL)isEqualToPhotoModel:(HXPhotoModel * _Nullable)photoModel;
 
- /// 获取当前asset是不是iCloud上的资源
 
- - (void)isICloudAssetWithCompletion:(void (^_Nullable)(BOOL isICloud, HXPhotoModel * _Nullable model))completion;
 
- #pragma mark - < Request >
 
- + (id _Nullable)requestImageWithURL:(NSURL *_Nullable)url progress:(void (^ _Nullable) (NSInteger receivedSize, NSInteger expectedSize))progress completion:(void (^ _Nullable) (UIImage * _Nullable image, NSURL * _Nullable url, NSError * _Nullable error))completion;
 
- /// 请求获取缩略图,主要用在列表上展示。此方法会回调多次,如果为视频的话就是视频封面
 
- - (PHImageRequestID)requestThumbImageCompletion:(HXModelImageSuccessBlock _Nullable)completion;
 
- - (PHImageRequestID)requestThumbImageWithWidth:(CGFloat)width
 
-                                     completion:(HXModelImageSuccessBlock _Nullable)completion;
 
- /// 请求获取缩略图,主要用在列表上展示。此方法只会回调一次
 
- - (PHImageRequestID)highQualityRequestThumbImageWithWidth:(CGFloat)width
 
-                                                completion:(HXModelImageSuccessBlock _Nullable )completion;
 
- /// 请求获取预览大图,此方法只会回调一次,如果为视频的话就是视频封面
 
- /// @param size 请求图片质量大小,不是尺寸的大小
 
- - (PHImageRequestID)requestPreviewImageWithSize:(CGSize)size
 
-                              startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                 progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                         success:(HXModelImageSuccessBlock _Nullable)success
 
-                                          failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 请求获取LivePhoto
 
- /// @param size 请求图片质量大小,不是尺寸的大小
 
- - (PHImageRequestID)requestLivePhotoWithSize:(CGSize)size
 
-                           startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                              progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                      success:(HXModelLivePhotoSuccessBlock _Nullable)success
 
-                                       failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 请求获取本地LivePhoto
 
- - (void)requestLocalLivePhotoWithReqeustID:(void (^ _Nullable)(PHLivePhotoRequestID requestID))requestID
 
-                                     header:(void (^ _Nullable)(AVAssetWriter * _Nullable writer, AVAssetReader * _Nullable videoReader, AVAssetReader * _Nullable audioReader))header
 
-                                 completion:(HXModelLivePhotoSuccessBlock _Nullable)completion;
 
- /// 请求获取ImageData
 
- - (PHImageRequestID)requestImageDataStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                        progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                                success:(HXModelImageDataSuccessBlock _Nullable)success
 
-                                                 failed:(HXModelFailedBlock _Nullable)failed;
 
- - (PHImageRequestID)requestImageDataWithLoadOriginalImage:(BOOL)originalImage
 
-                                        startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                           progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                                   success:(HXModelImageDataSuccessBlock _Nullable)success
 
-                                                    failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 请求获取AVAsset
 
- - (PHImageRequestID)requestAVAssetStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                      progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                              success:(HXModelAVAssetSuccessBlock _Nullable)success
 
-                                               failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 请求获取AVAssetExportSession
 
- - (PHImageRequestID)requestAVAssetExportSessionStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                                   progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                                        success:(HXModelAVExportSessionSuccessBlock _Nullable)success
 
-                                                            failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 请求获取AVPlayerItem
 
- - (PHImageRequestID)requestAVPlayerItemStartRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-                                           progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                                success:(HXModelAVPlayerItemSuccessBlock _Nullable)success
 
-                                                    failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 导出视频
 
- /// @param presetName 视频质量,为空时默认 AVAssetExportPresetMediumQuality
 
- /// @param startRequestICloud 准备开始下载iCloud上的视频,如果视频是iCloud的视频则会先下载
 
- /// @param iCloudProgressHandler iCloud下载进度
 
- /// @param exportProgressHandler 视频导出进度
 
- - (void)exportVideoWithPresetName:(NSString * _Nullable)presetName
 
-                startRequestICloud:(HXModelStartRequestICloud _Nullable)startRequestICloud
 
-             iCloudProgressHandler:(HXModelProgressHandler _Nullable)iCloudProgressHandler
 
-             exportProgressHandler:(HXModelExportVideoProgressHandler _Nullable)exportProgressHandler
 
-                           success:(HXModelExportVideoSuccessBlock _Nullable)success
 
-                            failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取imagePath
 
- /// 本地图片和网络图片会获取不到,只针对有PHAsset
 
- /// @return 请求的id,可用于取消请求 [self.asset cancelContentEditingInputRequest:(PHContentEditingInputRequestID)];
 
- /// @param startRequestICloud 开始下载iCloud上的视频,如果视频是iCloud的视频则会先下载
 
- /// @param progressHandler iCloud下载进度
 
- - (PHContentEditingInputRequestID)requestImageURLStartRequestICloud:(void (^ _Nullable)(
 
-                                                                                         PHContentEditingInputRequestID iCloudRequestId,
 
-                                                                                         HXPhotoModel * _Nullable model)
 
-                                                                      )startRequestICloud
 
-                                                     progressHandler:(HXModelProgressHandler _Nullable)progressHandler
 
-                                                             success:(HXModelImageURLSuccessBlock _Nullable)success
 
-                                                              failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取Livephoto里的图片和视频地址
 
- - (void)requestLivePhotoAssetsWithSuccess:(HXModelLivePhotoAssetsSuccessBlock _Nullable)success
 
-                                    failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取本地图片的URL,内部会将image写入临时目录然后生成文件路径
 
- /// 不是本地图片的会走失败回调
 
- - (void)getCameraImageURLWithSuccess:(HXModelImageURLSuccessBlock _Nullable)success
 
-                               failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取当前资源的image,包括本地/网络图片、视频
 
- /// 如果为视频则为视频封面
 
- - (void)getImageWithSuccess:(HXModelImageSuccessBlock _Nullable)success
 
-                      failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取当前资源的URL,包括本地/网络图片、视频
 
- /// 此方法导出手机里的视频质量为中等质量
 
- - (void)getAssetURLWithSuccess:(HXModelURLHandler _Nullable)success
 
-                         failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取当前资源的URL,包括本地/网络图片、视频
 
- /// @param presetName 视频质量,为空的话默认 AVAssetExportPresetMediumQuality
 
- - (void)getAssetURLWithVideoPresetName:(NSString * _Nullable)presetName
 
-                                success:(HXModelURLHandler _Nullable)success
 
-                                 failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取原视频地址
 
- - (void)getVideoURLWithSuccess:(HXModelURLHandler _Nullable)success
 
-                         failed:(HXModelFailedBlock _Nullable)failed;
 
- /// 获取图片地址
 
- /// @param resultHandler 获取结果
 
- - (void)getImageURLWithResultHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel))resultHandler;
 
- /// 获取视频地址
 
- /// @param exportPreset 导出的视频分辨率, HXVideoExportPresetRatio_Original 为获取原始视频
 
- /// @param videoQuality 导出的视频质量 [1-10]
 
- /// @param resultHandler 导出结果
 
- - (void)getVideoURLWithExportPreset:(HXVideoExportPreset)exportPreset
 
-                        videoQuality:(NSInteger)videoQuality
 
-                       resultHandler:(void (^ _Nullable)(HXAssetURLResult * _Nullable result, HXPhotoModel * _Nonnull photoModel))resultHandler;
 
- @property (assign, nonatomic) CGFloat previewContentOffsetX;
 
- @end
 
 
  |