1. 程式人生 > >【iOS】拍照/相簿單選、相簿多選、圖片瀏覽、圖片裁剪

【iOS】拍照/相簿單選、相簿多選、圖片瀏覽、圖片裁剪

有一段時間沒有寫iOS系列的部落格了。最近由於專案的需要,就有封裝了一個拍照/相簿單選、相簿多選、圖片瀏覽、圖片裁剪的工具類。在封裝這這類是站在巨人的肩膀上做的。
1.ZLPhotoBrowser:https://github.com/longitachi/ZLPhotoBrowser
2.VPImageCropper:https://github.com/windshg/VPImageCropper
上面一個是相簿和相機的,下面一個是圖片裁剪。
而我要做的就是把這兩個封裝在一起滿足我們專案的需求。

常見場景

1.個人中心,修改個人頭像,需要拍照或是從相簿選圖,這個一般是一張且帶有裁剪功能。那麼我的這個封裝可以滿足這個需求。

2.確認購物後發表評論,這是 一般是可以上傳圖片的,而且是可以多張,那麼這個封裝也可以滿足需求。

兩個庫

關於上面提到的兩個庫,大家可以去庫的github上面檢視或是自行百度。

我的封裝

我封裝就是在ZLPhotoBrowser庫的基礎上增加了一個ZLOnePhoto類,然後把VPImageCropper給整合進去。
在ZLOnePhoto類裡面只有一個方法就可以搞定上面的兩個場景。

typedef NS_ENUM(NSInteger, PickerType)
{
    PickerType_Camera = 0, // 拍照
    PickerType_Photo, // 照片
};
typedef NS_ENUM(NSInteger, PhotoCutType)
{
    PhotoCutType_YES = 0
, // 裁剪 PhotoCutType_NO, // 不裁剪 }; /** 相片選擇回撥 @param image 相片資訊 @param isCancel 是否取消 1:取消 0 沒取消 */ typedef void(^CallBackBlock)(UIImage *image, BOOL isCancel); @interface ZLOnePhoto : NSObject /** 單例 @return ZLOnePhoto */ + (instancetype)shareInstance; /** 拍照或是選擇相簿 @param pickerType PickerType @param
photoCutType 是否裁剪 @param vc 呼叫此方法的控制器 @param callBackBlock 回撥 */
- (void)presentPicker:(PickerType)pickerType photoCut:(PhotoCutType)photoCutType target:(UIViewController *)vc callBackBlock:(CallBackBlock)callBackBlock;

不同的需求通過設定不同的列舉值就可以了,使用起來很方便,選擇結果直接在block裡面回撥。
例如:

// 相簿單選  不裁剪
ZLOnePhoto *one = [ZLOnePhoto shareInstance];
[one presentPicker:PickerType_Photo photoCut:PhotoCutType_NO target:self callBackBlock:^(UIImage *image, BOOL isCancel) {
                self.imageView.image = image;
            }];

兩個庫怎麼連線起來

兩個庫的連線是在UIImagePickerControllerDelegate的代理方法- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info裡面做的。詳細的處理大家可以去我的github檢視程式碼。

iOS10許可權

在info.plist中加入:

<key>NSPhotoLibraryUsageDescription</key>
<string>需要您的同意,才能訪問相簿</string>
<key>NSCameraUsageDescription</key>
<string>需要您的同意,才能訪問相機</string>

效果圖

程式碼下載

請點選我!