【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>