使用 ZLPhotoBrowser 相機(jī),調(diào)用其編輯功能

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è)功能。

思路

  1. 拍照完成后,利用Photos框架進(jìn)行照片保存
  2. 根據(jù)保存后的 localIdentifier 獲取到相冊(cè)這張圖片的 PHAsset 對(duì)象
  3. 調(diào)用 ZLPhotoActionSheetpreviewPhotos: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)

  1. 調(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,在這里替換成你自己的控制器即可。

  1. 保存照片到相冊(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è),然后取出最后一張照片)

  1. 獲取圖片的 PHAsset 對(duì)象
PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[createAsset.localIdentifier] options:nil].lastObject;
  1. 調(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) {}];
}

ZLPhotoBrowser地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。