XYPhotoKit
XYPhotoKit copied to clipboard
照片选择库,提供拍照和相册两种方式,支持单选多选,数据层是PhotoKit
XYPhotoKit
基于PhotoKit开发的照片获取方式,支持多选单选(对应的UI略有不同),支持iCloud获取相册等
使用方式
详情见demo
查看
相册获取方式
属性 | 说明 |
---|---|
Controller | |
XYPhotoMultiImagePicker | NavigationController,承载两个VC栈、相册相关参数初始化工作及 delegate & datasource |
XYPhotoAlbumListController | 系统和用户的相册列表(tableview),根据CLPhotoMultiPickerStartPosition来确定初始展示哪个VC界面 |
XYPhotoAlbumDetailController | 某个相册的详情(collectionView),单选多选照片的不同交互主要完成于此,可进入大图预览 |
XYPhotoPreviewViewController | 大图预览(XYHorizontalScrollView) |
用法
XYPhotoMultiImagePicker *multiImagePicker = [[XYPhotoMultiImagePicker alloc] init];
multiImagePicker.pickerDelegate = self;
multiImagePicker.pickerDataSource = self;
multiImagePicker.mediaType = PHAssetMediaTypeImage; // 支持图片和视屏
multiImagePicker.maxNumberOfAssets = 9; // 最多选择九张照片
multiImagePicker.assetCollectionViewColumnCount = 4; // 获取
multiImagePicker.startPosition = CLPhotoMultiPickerStartPositionAlbums; // 相册列表开始进入
multiImagePicker.allowNetRequestIfiCloud = YES; // 支持iCloud网络获取
[self presentViewController:multiImagePicker animated:YES completion:nil];
#pragma mark - XYPhotoMultiImagePickerDelegate, XYPhotoMultiImagePickerDataSource
- (void)multiImagePicker:(XYPhotoMultiImagePicker *)multiImagePicker selectedAssets:(NSArray<PHAsset *> *)assets
{
_selectedAssets = assets;
NSLog(@"%@", @(assets.count));
}
- (NSArray<PHAsset *> *)multiImagePickerLoadPresetSelectedAssets
{
return _selectedAssets;
}
相机获取方式
属性 | 说明 |
---|---|
Controller | |
XYPhotoMultiCameraPicker | NavigationController,承载XYPhotoCameraController、相机相关参数初始化工作及 delegate & datasource |
XYPhotoCameraController | 基于ImagePickerController,需要有相机和相册两个权限做交互,可进入大图预览 |
XYPhotoPreviewViewController | 大图预览(XYHorizontalScrollView) |
用法
XYPhotoMultiCameraPicker *camera = [[XYPhotoMultiCameraPicker alloc] init];
camera.pickerDelegate = self;
camera.pickerDataSource = self;
camera.maxNumberOfAssets = 9; // 最多选择九张照片
camera.allowNetRequestIfiCloud = YES; // 支持iCloud网络获取
[self presentViewController:camera animated:YES completion:nil];
#pragma mark - XYPhotoMultiCameraPickerDelegate, XYPhotoMultiCameraPickerDataSource
- (void)multiCameraPicker:(XYPhotoMultiCameraPicker *)multiImagePicker selectedAssets:(NSArray<PHAsset *> *)assets
{
_selectedAssets = assets.copy;
NSLog(@"%@",assets);
}
- (NSArray<PHAsset *> *)multiCameraPickerLoadPresetSelectedAssets
{
return _selectedAssets;
}
综述
以上获取都是PHAsset对象,PHAsset 非常灵活,详见文档,同步异步请求、支持网络、请求progress等等可以查看 PHImageRequestOptions
例如:支持网络获取(如果是本地就直接本地获取)asset对象大小为
targetSize
的图片 闭包中可能会有多次回调(本地图片)越来越高清,当网络请求时非特殊情况下不可直接获取原图尺寸CGSizeMake(asset.pixelWidth, asset.pixelHeight)
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = YES;
_imageRequestId = [self.imageManager requestImageForAsset:asset
targetSize:_targetSize
contentMode:PHImageContentModeAspectFit
options:options
resultHandler:^(UIImage *result, NSDictionary *info) {
BOOL downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue]
&& ![info objectForKey:PHImageErrorKey]
&& ![[info objectForKey:PHImageResultIsDegradedKey] boolValue];
if (downloadFinined) { self.imageRequestId = 0; }
if (result) { self.imageView.image = result; }
}];
todo & upgrade
- [x] 视频播放
- [ ] 拆分类的层级(比如接入LocalImagePicker等等)
- [ ] 完善其他获取照片的拓展方法 & 工具(视频压缩、图片压缩,指定相册图片写入等等)
- [ ] 添加iCloud加载的请求等待提示
- [ ] 大图预览添加过渡动画,视频播放、消失添加fade
- [ ] 大图预览改换使用pageController
- [x] 持久化&有效性验证:对PHAsset持久化存储只需储存
photoAsset.localIdentifier
的唯一标识,验证对象是否还存在于相册中(即有效性)需要对唯一标识做遍历对比