• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

HXPhotoPicker: 图片/视频选择器 - 支持LivePhoto、GIF图片选择、3DTouch预览、在线下 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

HXPhotoPicker

开源软件地址:

https://gitee.com/fengyeG/HXPhotoPicker

开源软件介绍:

Swift版本

目录

特性 - Features

  • 查看、选择GIF图片
  • 照片、视频可同时多选/原图
  • 3DTouch预览照片
  • 长按拖动改变顺序
  • 自定义相机拍照、录制视频
  • 自定义转场动画
  • 查看、选择LivePhoto iOS9.1以上才有用
  • 浏览网络图片、网络视频
  • 仿微信编辑图片功能
  • 自定义裁剪视频时长
  • 传入本地图片、视频
  • 在线下载iCloud上的资源
  • 两种相册展现方式(列表、弹窗)
  • 支持Cell上添加
  • 支持草稿功能
  • 同一界面多个不同选择器
  • 支持暗黑模式
  • 支持横向布局
  • 支持Xib和Masonry布局
  • 支持自定义item的大小
  • 支持滑动手势选择

安装 - 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
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap