ZLPhotoBrowser 介紹
方便易用的相冊(cè)多選框架,支持預(yù)覽/相冊(cè)內(nèi)拍照及錄視頻、拖拽/滑動(dòng)選擇,3DTouch預(yù)覽,編輯裁剪圖片/視頻,導(dǎo)出視頻(可添加水印,粒子特效,視頻轉(zhuǎn)碼);支持多語(yǔ)言國(guó)際化(中文簡(jiǎn)/繁,英語(yǔ),日語(yǔ),可手動(dòng)切換);在線下載iCloud端圖片;支持預(yù)覽網(wǎng)絡(luò)及本地圖片/視頻。
遇到的問(wèn)題
在使用 ZLPhotoBrowser
的相機(jī)功能時(shí),發(fā)現(xiàn)拍照完成后,并沒(méi)有編輯功能,只能采取婉轉(zhuǎn)的方式去實(shí)現(xiàn)這樣的一個(gè)功能。
思路
- 拍照完成后,利用
Photos
框架進(jìn)行照片保存 - 根據(jù)保存后的
localIdentifier
獲取到相冊(cè)這張圖片的PHAsset
對(duì)象 - 調(diào)用
ZLPhotoActionSheet
的previewPhotos:index:hideToolBar:complete:
方法
ZLPhotoActionSheet
有一個(gè)這樣的方法進(jìn)行圖片展示
/**
提供 混合預(yù)覽照片及視頻的方法, 相冊(cè)PHAsset / 網(wǎng)絡(luò)、本地圖片 / 網(wǎng)絡(luò)、本地視頻,(需先設(shè)置 sender 參數(shù))
@warning photos 內(nèi)對(duì)象請(qǐng)調(diào)用 ZLDefine 中 GetDictForPreviewPhoto 方法,e.g.: GetDictForPreviewPhoto(image, ZLPreviewPhotoTypeUIImage)
@param photos 接收對(duì)象 ZLDefine 中 GetDictForPreviewPhoto 生成的字典
@param index 點(diǎn)擊的照片/視頻索引
@param hideToolBar 是否隱藏底部工具欄和導(dǎo)航右上角選擇按鈕
@param complete 回調(diào) (數(shù)組內(nèi)為接收的 PHAsset / UIImage / NSURL 對(duì)象)
*/
- (void)previewPhotos:(NSArray<NSDictionary *> *)photos index:(NSInteger)index hideToolBar:(BOOL)hideToolBar complete:(void (^)(NSArray *photos))complete;
實(shí)現(xiàn)
- 調(diào)用
ZLPhotoBrowser
相機(jī)功能
ZLCustomCamera *camera = [ZLCustomCamera new];
camera.allowRecordVideo = NO; // 這里不需要視頻功能,所以禁止掉了
camera.doneBlock = ^(UIImage *image, NSURL *videoUrl) {
[self saveImage:image]; // 保存照片
};
[self.owner showDetailViewController:camera sender:self.owner];
self.owner
是一個(gè)UIViewController
,在這里替換成你自己的控制器即可。
- 保存照片到相冊(cè)
NSError *error = nil;
// 保存圖片到相冊(cè)
__block PHObjectPlaceholder *createAsset = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
createAsset = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset; // PHAssetCreationRequest 是iOS9 之后才有的
} error:&error];
蘋果對(duì) PHObjectPlaceholder
的介紹
PHObjectPlaceholder
這個(gè)對(duì)象,繼承于PHObject
,有一個(gè) localIdentifier
屬性,我們可以通過(guò)這個(gè)屬性獲取到相冊(cè)這張照片的 PHAsset
類型對(duì)象。(網(wǎng)上查了資料,發(fā)現(xiàn)很多方式都是通過(guò)遍歷相冊(cè),然后取出最后一張照片)
- 獲取圖片的
PHAsset
對(duì)象
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[createAsset.localIdentifier] options:nil].lastObject;
- 調(diào)用
previewPhotos:index:hideToolBar:complete:
方法
NSArray *array = @[GetDictForPreviewPhoto(asset, ZLPreviewPhotoTypePHAsset)];
[self.actionSheet previewPhotos:array index:0 hideToolBar:NO complete:^(NSArray * _Nonnull photos) {}];
最后委婉的實(shí)現(xiàn)了編輯操作。
/**
* 保存圖片,并且跳轉(zhuǎn)編輯
*/
- (void)saveImage:(UIImage *)image {
NSError *error = nil;
// 保存圖片到相冊(cè)
__block PHObjectPlaceholder *createAsset = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
createAsset = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset; // PHAssetCreationRequest 是iOS9 之后才有的
} error:&error];
// 保存圖片失敗
if (error || createAsset == nil || !createAsset.localIdentifier.length) return;
// 根據(jù) localIdentifier 獲取到圖片
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[createAsset.localIdentifier] options:nil].lastObject;
NSArray *array = @[GetDictForPreviewPhoto(asset, ZLPreviewPhotoTypePHAsset)];
[self.actionSheet previewPhotos:array index:0 hideToolBar:NO complete:^(NSArray * _Nonnull photos) {}];
}