开源软件名称:HXPhotoPicker
开源软件地址:https://gitee.com/fengyeG/HXPhotoPicker
开源软件介绍:
Swift版本
目录 特性 - Features 安装 - Installation CocoaPods# 将以下内容添加到您的Podfile中:# 不使用网络图片功能pod 'HXPhotoPicker', '~> 3.3.0' # 使用SDWebImage加载网络图片pod 'HXPhotoPicker/SDWebImage', '~> 3.3.0' # 使用YYWebImage加载网络图片pod 'HXPhotoPicker/YYWebImage', '~> 3.3.0'# 搜索不到库或最新版时请执行pod repo update 或 rm ~/Library/Caches/CocoaPods/search_index.json Carthage# 将以下内容添加到您的Cartfile中:github "SilenceLove/HXPhotoPicker" 手动导入手动导入:将项目中的“HXPhotoPicker”文件夹拖入项目中使用前导入头文件 "HXPhotoPicker.h" 要求 - Requirements- iOS8及以上系统可使用. ARC环境. - iOS 8 or later. Requires ARC
- 访问相册和相机需要配置四个info.plist文件
- Privacy - Photo Library Usage Description 和 Privacy - Camera Usage Description 以及 Privacy - Microphone Usage Description
- Privacy - Location When In Use Usage Description 使用相机拍照时会获取位置信息
- 相机拍照功能请使用真机调试
应用示例 - Examples 跳转相册选择照片// 懒加载 照片管理类- (HXPhotoManager *)manager { if (!_manager) { _manager = [[HXPhotoManager alloc] initWithType:HXPhotoManagerSelectedTypePhotoAndVideo]; } return _manager;}// 方法一:HXWeakSelf[self hx_presentSelectPhotoControllerWithManager:self.manager didDone:^(NSArray<HXPhotoModel *> *allList, NSArray<HXPhotoModel *> *photoList, NSArray<HXPhotoModel *> *videoList, BOOL isOriginal, UIViewController *viewController, HXPhotoManager *manager) { weakSelf.total.text = [NSString stringWithFormat:@"总数量:%ld ( 照片:%ld 视频:%ld )",allList.count, photoList.count, videoList.count]; weakSelf.original.text = isOriginal ? @"YES" : @"NO"; NSSLog(@"block - all - %@",allList); NSSLog(@"block - photo - %@",photoList); NSSLog(@"block - video - %@",videoList);} cancel:^(UIViewController *viewController, HXPhotoManager *manager) { NSSLog(@"block - 取消了");}];// 方法二:// 照片选择控制器 HXCustomNavigationController *nav = [[HXCustomNavigationController alloc] initWithManager:self.manager delegate:self];[self presentViewController:nav animated:YES completion:nil];// 通过 HXCustomNavigationControllerDelegate 代理返回选择的图片以及视频/**点击完成按钮@param photoNavigationViewController self@param allList 已选的所有列表(包含照片、视频)@param photoList 已选的照片列表@param videoList 已选的视频列表@param original 是否原图*/- (void)photoNavigationViewController:(HXCustomNavigationController *)photoNavigationViewController didDoneAllList:(NSArray<HXPhotoModel *> *)allList photos:(NSArray<HXPhotoModel *> *)photoList videos:(NSArray<HXPhotoModel *> *)videoList original:(BOOL)original;/**点击取消@param photoNavigationViewController self*/- (void)photoNavigationViewControllerDidCancel:(HXCustomNavigationController *)photoNavigationViewController; 单独使用HXPhotoPreviewViewController预览图片HXCustomAssetModel *assetModel1 = [HXCustomAssetModel assetWithLocaImageName:@"1" selected:YES];// selected 为NO 的会过滤掉HXCustomAssetModel *assetModel2 = [HXCustomAssetModel assetWithLocaImageName:@"2" selected:NO];HXCustomAssetModel *assetModel3 = [HXCustomAssetModel assetWithNetworkImageURL:[NSURL URLWithString:@"http://tsnrhapp.oss-cn-hangzhou.aliyuncs.com/1466408576222.jpg"] selected:YES];// selected 为NO 的会过滤掉HXCustomAssetModel *assetModel4 = [HXCustomAssetModel assetWithNetworkImageURL:[NSURL URLWithString:@"http://tsnrhapp.oss-cn-hangzhou.aliyuncs.com/0034821a-6815-4d64-b0f2-09103d62630d.jpg"] selected:NO];NSURL *url = [[NSBundle mainBundle] URLForResource:@"QQ空间视频_20180301091047" withExtension:@"mp4"];HXCustomAssetModel *assetModel5 = [HXCustomAssetModel assetWithLocalVideoURL:url selected:YES];HXPhotoManager *photoManager = [HXPhotoManager managerWithType:HXPhotoManagerSelectedTypePhotoAndVideo];photoManager.configuration.saveSystemAblum = YES;photoManager.configuration.photoMaxNum = 0;photoManager.configuration.videoMaxNum = 0;photoManager.configuration.maxNum = 10;photoManager.configuration.selectTogether = YES;photoManager.configuration.photoCanEdit = NO;photoManager.configuration.videoCanEdit = NO;HXWeakSelf// 长按事件photoManager.configuration.previewRespondsToLongPress = ^(UILongPressGestureRecognizer *longPress, HXPhotoModel *photoModel, HXPhotoManager *manager, HXPhotoPreviewViewController *previewViewController) { hx_showAlert(previewViewController, @"提示", @"长按事件", @"确定", nil, nil, nil);};// 跳转预览界面时动画起始的viewphotoManager.configuration.customPreviewFromView = ^UIView *(NSInteger currentIndex) { HXPhotoSubViewCell *viewCell = [weakSelf.photoView collectionViewCellWithIndex:currentIndex]; return viewCell;};// 跳转预览界面时展现动画的imagephotoManager.configuration.customPreviewFromImage = ^UIImage *(NSInteger currentIndex) { HXPhotoSubViewCell *viewCell = [weakSelf.photoView collectionViewCellWithIndex:currentIndex]; return viewCell.imageView.image;};// 退出预览界面时终点viewphotoManager.configuration.customPreviewToView = ^UIView *(NSInteger currentIndex) { HXPhotoSubViewCell *viewCell = [weakSelf.photoView collectionViewCellWithIndex:currentIndex]; return viewCell;};[photoManager addCustomAssetModel:@[assetModel1, assetModel2, assetModel3, assetModel4, assetModel5]];[self hx_presentPreviewPhotoControllerWithManager:photoManager previewStyle:HXPhotoViewPreViewShowStyleDark currentIndex:0 photoView:nil];UIViewController+HXExtension.h/// 跳转预览照片界面/// @param manager 照片管理者/// @param previewStyle 预览样式/// @param currentIndex 当前预览的下标/// @param photoView 照片展示视图 - 没有就不传- (void)hx_presentPreviewPhotoControllerWithManager:(HXPhotoManager *)manager previewStyle:(HXPhotoViewPreViewShowStyle)previewStyle currentIndex:(NSUInteger)currentIndex photoView:(HXPhotoView * _Nullable)photoView; 单独使用照片、视频编辑功能// 单独使用照片编辑功能HXPhotoModel *photoModel = [HXPhotoModel photoModelWithImage:[UIImage imageNamed:@"1"]];[self hx_presentPhotoEditViewControllerWithManager:self.manager photoModel:photoModel delegate:nil done:^(HXPhotoModel *beforeModel, HXPhotoModel *afterModel, HXPhotoEditViewController *viewController) { // beforeModel编辑之前、afterModel编辑之后 weakSelf.imageView.image = afterModel.thumbPhoto;} cancel:^(HXPhotoEditViewController *viewController) { // 取消}];// 单独使用仿微信编辑功能[self hx_presentWxPhotoEditViewControllerWithConfiguration:self.manager.configuration.photoEditConfigur photoModel:photoModel delegate:nil finish:^(HXPhotoEdit * _Nonnull photoEdit, HXPhotoModel * _Nonnull photoModel, HX_PhotoEditViewController * _Nonnull viewController) { if (photoEdit) { // 有编辑过 weakSelf.imageView.image = photoEdit.editPreviewImage; }else { // 为空则未进行编辑 weakSelf.imageView.image = photoModel.thumbPhoto; } // 记录下当前编辑的记录,再次编辑可在上一次基础上进行编辑 weakSelf.photoEdit = photoEdit;} cancel:^(HX_PhotoEditViewController * _Nonnull viewController) { // 取消}];// 单独使用视频编辑功能NSURL *url = [[NSBundle mainBundle] URLForResource:@"QQ空间视频_20180301091047" withExtension:@"mp4"];HXPhotoModel *videoModel = [HXPhotoModel photoModelWithVideoURL:url];[self hx_presentVideoEditViewControllerWithManager:self.manager videoModel:videoModel delegate:nil done:^(HXPhotoModel *beforeModel, HXPhotoModel *afterModel, HXVideoEditViewController *viewController) { // beforeModel编辑之前、afterModel编辑之后 weakSelf.imageView.image = afterModel.thumbPhoto;} cancel:^(HXVideoEditViewController *viewController) { // 取消}]; 如何获取照片和视频// 如果将_manager.configuration.requestImageAfterFinishingSelection 设为YES,// 那么在选择完成的时候就会获取图片和视频地址// 如果选中了原图那么获取图片时就是原图// 获取视频时如果设置 exportVideoURLForHighestQuality 为YES,则会去获取高等质量的视频。其他情况为中等质量的视频// 个人建议不在选择完成的时候去获取,因为每次选择完都会去获取。获取过程中可能会耗时过长// 可以在要上传的时候再去获取for (HXPhotoModel *model in self.selectList) { // 数组里装的是所有类型的资源,需要判断 // 先判断资源类型 if (model.subType == HXPhotoModelMediaSubTypePhoto) { // 当前为图片 if (model.photoEdit) { // 如果有编辑数据,则说明这张图篇被编辑过了 // 需要这样才能获取到编辑之后的图片 model.photoEdit.editPreviewImage; return; } // 再判断具体类型 if (model.type == HXPhotoModelMediaTypeCameraPhoto) { // 到这里就说明这张图片不是手机相册里的图片,可能是本地的也可能是网络图片 // 关于相机拍照的的问题,当系统 < ios9.0的时候拍的照片虽然保存到了相册但是在列表里存的是本地的,没有PHAsset // 当系统 >= ios9.0 的时候拍的照片就不是本地照片了,而是手机相册里带有PHAsset对象的照片 // 这里的 model.asset PHAsset是空的 // 判断具体类型 if (model.cameraPhotoType == HXPhotoModelMediaTypeCameraPhotoTypeLocal) { // 本地图片 }else if (model.cameraPhotoType == HXPhotoModelMediaTypeCameraPhotoTypeLocalGif) { // 本地gif图片 }else if (model.cameraPhotoType == HXPhotoModelMediaTypeCameraPhotoTypeNetWork) { // 网络图片 }else if (model.cameraPhotoType == HXPhotoModelMediaTypeCameraPhotoTypeNetWorkGif) { // 网络gif图片 } // 上传图片的话可以不用判断具体类型,按下面操作取出图片 if (model.networkPhotoUrl) { // 如果网络图片地址有值就说明是网络图片,可直接拿此地址直接使用。避免重复上传 // 这里需要注意一下,先要判断是否为图片。因为如果是网络视频的话此属性代表视频封面地址 }else { // 网络图片地址为空了,那就肯定是本地图片了 // 直接取 model.previewPhoto 或者 model.thumbPhoto,这两个是同一个image } }else { // 到这里就是手机相册里的图片了 model.asset PHAsset对象是有值的 // 如果需要上传 Gif 或者 LivePhoto 需要具体判断 if (model.type == HXPhotoModelMediaTypePhoto) { // 普通的照片,如果不可以查看和livePhoto的时候,这就也可能是GIF或者LivePhoto了, // 如果你的项目不支持动图那就不要取NSData或URL,因为如果本质是动图的话还是会变成动图传上去 // 这样判断是不是GIF model.photoFormat == HXPhotoModelFormatGIF // 如果 requestImageAfterFinishingSelection = YES 的话,直接取 model.previewPhoto 或者 model.thumbPhoto 在选择完成时候已经获取并且赋值了 // 获取image // size 就是获取图片的质量大小,原图的话就是 PHImageManagerMaximumSize,其他质量可设置size来获取 CGSize size; if (self.original) { size = PHImageManagerMaximumSize; }else { size = CGSizeMake(model.imageSize.width * 0.5, model.imageSize.height * 0.5); } [model requestPreviewImageWithSize:size startRequestICloud:^(PHImageRequestID iCloudRequestId, HXPhotoModel * _Nullable model) { // 如果图片是在iCloud上的话会先走这个方法再去下载 } progressHandler:^(double progress, HXPhotoModel * _Nullable model) { // iCloud的下载进度 } success:^(UIImage * _Nullable image, HXPhotoModel * _Nullable model, NSDictionary * _Nullable info) { // image } failed:^(NSDictionary * _Nullable info, HXPhotoModel * _Nullable model) { // 获取失败 }]; }else if (model.type == HXPhotoModelMediaTypePhotoGif) { // 动图,如果 requestImageAfterFinishingSelection = YES 的话,直接取 model.imageURL。因为在选择完成的时候已经获取了不用再去获取 model.imageURL; // 上传动图时,不要直接拿image上传哦。可以获取url或者data上传 // 获取url [model requestImageURLStartRequestICloud:nil progressHandler:nil success:^(NSURL * _Nullable imageURL, HXPhotoModel * _Nullable model, NSDictionary * _Nullable info) { // 下载完成,imageURL 本地地址 } failed:nil]; // 获取data [model requestImageDataStartRequestICloud:nil progressHandler:nil success:^(NSData * _Nullable imageData, UIImageOrientation orientation, HXPhotoModel * _Nullable model, NSDictionary * _Nullable info) { // imageData } failed:nil]; }else if (model.type == HXPhotoModelMediaTypeLivePhoto) { // LivePhoto,requestImageAfterFinishingSelection = YES 时没有处理livephoto,需要自己处理 // 如果需要上传livephoto的话,需要上传livephoto里的图片和视频 // 展示的时候需要根据图片和视频生成livephoto [model requestLivePhotoAssetsWithSuccess:^(NSURL * _Nullable imageURL, NSURL * _Nullable videoURL, BOOL isNetwork, HXPhotoModel * _Nullable model) { // imageURL - LivePhoto里的照片封面地址 // videoURL - LivePhoto里的视频地址 } failed:^(NSDictionary * _Nullable info, HXPhotoModel * _Nullable model) { // 获取失败 }]; } // 也可以不用上面的判断和方法获取,自己根据 model.asset 这个PHAsset对象来获取想要的东西 PHAsset *asset = model.asset; // 自由发挥 } }else if (model.subType == HXPhotoModelMediaSubTypeVideo) { // 当前为视频 if (model.type == HXPhotoModelMediaTypeVideo) { // 为手机相册里的视频 // requestImageAfterFinishingSelection = YES 时,直接去 model.videoURL,在选择完成时已经获取了 model.videoURL; // 获取视频时可以获取 AVAsset,也可以获取 AVAssetExportSession,获取之后再导出视频 // 获取 AVAsset [model requestAVAssetStartRequestICloud:nil progressHandler:nil success:^(AVAsset * _Nullable avAsset, AVAudioMix * _Nullable audioMix, HXPhotoModel * _Nullable model, NSDictionary * _Nullable info) { // avAsset // 自己根据avAsset去导出视频 } failed:nil]; // 获取 AVAssetExportSession [model requestAVAssetExportSessionStartRequestICloud:nil progressHandler:nil success
|
请发表评论