本文已参与「新人创作礼」活动,一起开启掘金创作之路
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
前言
- iOS图片选择器,iOS14之前用UIImagePickerController,从相册选择图片,iOS14之后苹果推出了PHPickerViewController。优势就是PHPicker不需要系统授权,直接访问
代理
<PHPickerViewControllerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
-(**void**)pickPhotoWithVC:(UIViewController *)currentVC
{
**self**.currentVC = currentVC;
**if** ( **@available**(iOS 14, *)){
// [self userPhpickerWithVC:currentVC];
PHPickerConfiguration *config = [[PHPickerConfiguration alloc] init];
config.selectionLimit = 1;
config.filter = [PHPickerFilter imagesFilter];
PHPickerViewController *pickerViewController = [[PHPickerViewController alloc] initWithConfiguration:config];
pickerViewController.delegate = **self**;
[currentVC.navigationController pushViewController:pickerViewController animated:**YES**];
}**else**{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate = **self**;
[currentVC presentViewController:imagePicker animated:**YES** completion:**nil**];
\
}
}
-
因为要兼容iOS14之前的设备,所以加上了UIImagePickerController 传统的picker。初步测试直接用UIImagePickerController也是不需要授权就可以访问的。但是UIimagepicker会有个数限制,最多9个
-
config.selectionLimit = 1;设置选取图片的个数,个数达到设置的上限之后会回调到选取图片的代理方法里面
-
效果图稍后再放上来
#pragma mark **-- PHpicker delegate**
-(**void**)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results API_AVAILABLE(ios(14)) API_AVAILABLE(ios(14)){
// [picker dismissViewControllerAnimated:YES completion:nil];
**for** (PHPickerResult *result **in** results) {
[result.itemProvider loadObjectOfClass:[UIImage class] completionHandler:^( **__kindof** **id**<NSItemProviderReading> **_Nullable** object, NSError * **_Nullable** error) {
NSLog(@"object: %@, error: %@", object, error);
**if** ([object isKindOfClass:[UIImage class]]) {
UIImage *image = (UIImage *)object;
dispatch_async(dispatch_get_main_queue(), ^{
[**self** clipImage:image andPicker:picker];
});
}
}];
}
}
#pragma mark **-- uiimagePicker delegate**
-(**void**)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,**id**> *)info {
}
-
两个代理方法里面都可以拿到相册的图片数组,遍历数组就可以拿到image对象, 剩下的怎么操作就看具体需求了,我这里需要一个图片裁切,因为图片有可能是长方形的或其他形状, 直接拿到图片往圆形的UIimageview上去添加会把图片拉伸或压缩变现,所以就给了一个裁切框
-
控制器都是present出来的, 拿到图片后就可以把照片选择的VC关闭
图片裁切相应的代码:
//裁剪图片
-(**void**)clipImage:(UIImage *)image andPicker:(UIViewController *)picker
{
HKImageClipperViewController *clipperVC = [[HKImageClipperViewController alloc]initWithBaseImg:image
resultImgSize:CGSizeMake(200, 200) clipperType:ClipperTypeImgMove];
\
**__weak** **typeof**(**self**)weakSelf = **self**;
clipperVC.cancelClippedHandler = ^(){
[picker dismissViewControllerAnimated:**YES** completion:**nil**];
};
clipperVC.successClippedHandler = ^(UIImage *clippedImage){
**__strong** **typeof**(**self**)strongSelf = weakSelf;
// !strongSelf.clippedImageHandler?:strongSelf.clippedImageHandler(clippedImage);
**self**.pickResultBlock(clippedImage);
// [picker dismissViewControllerAnimated:YES completion:nil];
[**self** disMissAll:clipperVC pick:picker];
};
[picker.navigationController pushViewController:clipperVC animated:**YES**];
}
- 我本着能自己造轮子就不用第三方的原则。但是事与愿违,项目紧,时间短。就在网上找了一个。等后面我再自己写一个图片裁切的功能上去,先讲究的用着吧。Mark一下