PHPicker的使用

600 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

持续创作,加速成长!这是我参与「掘金日新计划 · 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一下