美文网首页
封装相册选择器(UIImagePickerController)

封装相册选择器(UIImagePickerController)

作者: i_Leechee | 来源:发表于2015-11-26 09:30 被阅读1190次

    项目从社区改版到个人中心改版,多个地方需要用到选择照片、拍照上传的功能。于是将UIImagePickerController进行了简单的封装,方便项目多个地方快速使用。

    Screen Shot.png

    1.对系统判断,区分使用UIAlertController还是UIActionSheet进行提示选择。判断当前机型是否支持拍照功能。

     if (IOS8) {
            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"图片" message:@"选择" preferredStyle:UIAlertControllerStyleActionSheet];
            UIAlertAction *photoAlbumAction = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [self getAlertActionType:1];
            }];
            UIAlertAction *cemeraAction = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [self getAlertActionType:2];
            }];
            UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
                [self getAlertActionType:0];
            }];
            [alertController addAction:photoAlbumAction];
            [alertController addAction:cancleAction];
            if ([self imagePickerControlerIsAvailabelToCamera]) {
                [alertController addAction:cemeraAction];
            }
            [self.viewController presentViewController:alertController animated:YES completion:nil];
        } else {
            UIActionSheet *actionSheet;
            if([self imagePickerControlerIsAvailabelToCamera]){
                actionSheet  = [[UIActionSheet alloc] initWithTitle:@"选择图像" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照", @"从相册选择", nil];
            }else{
                actionSheet = [[UIActionSheet alloc] initWithTitle:@"选择图像" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"从相册选择", nil];
            }
            [actionSheet showInView:self.viewController.view];
        }
    
    
    // 判断硬件是否支持拍照
    - (BOOL)imagePickerControlerIsAvailabelToCamera {
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            return YES;
        } else {
            return NO;
        }
    }
    

    2.根据上面的判断创建UIImagePickerController

    - (void)getAlertActionType:(NSInteger)type {
        NSInteger sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        switch (type) {
            case 1:
            {
                sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            }
                break;
            case 2:
            {
                sourceType = UIImagePickerControllerSourceTypeCamera;
            }
                break;
            case 0:
            {
                return;
            }
                break;
                
            default:
                break;
        }
        [self creatUIImagePickerControllerWithAlertActionType:sourceType];  
    }
    

    3.创建UIImagePickerController并对当前系统授权进行判断

    - (void)creatUIImagePickerControllerWithAlertActionType:(NSInteger)type {
        NSInteger sourceType = type;
        if (sourceType == UIImagePickerControllerSourceTypeCamera) {
            if (![self AVAuthorizationStatusIsGranted]) {
                if (IOS8) {
                    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"相机未授权" message:@"请到设置-隐私-相机中修改" preferredStyle:UIAlertControllerStyleAlert];
                    UIAlertAction *comfirmAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                        return;
                    }];
                    [alertController addAction:comfirmAction];
                    [self.viewController presentViewController:alertController animated:YES completion:nil];
                    
                } else {
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"相机未授权" message:@"请到设置-隐私-相机中修改" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                    [alert show];
                    return;
                }
            }
        }
        
        self.picker = [[UIImagePickerController alloc] init];
        self.picker.delegate = self;
        self.picker.allowsEditing = YES;
        self.picker.sourceType = sourceType;
        [self.viewController presentViewController:self.picker animated:YES completion:nil];
    }
    
    #pragma mark - 照机授权判断
    - (BOOL)AVAuthorizationStatusIsGranted  {
        __block BOOL isGranted = NO;
        //判断是否授权相机
        NSString *mediaType = AVMediaTypeVideo;
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
        switch (authStatus) {
            case 0: { //第一次使用,则会弹出是否打开权限
                [AVCaptureDevice requestAccessForMediaType : AVMediaTypeVideo completionHandler:^(BOOL granted) {
                    //授权成功
                    if (granted) {
                        isGranted = YES;
                    }
                    else{
                        isGranted = NO;
                    }
                }];
            }
                break;
            case 1:{
                //还未授权
                isGranted = NO;
            }
                break;
            case 2:{
                //主动拒绝授权
                isGranted = NO;
            }
                break;
            case 3: {
                //已授权
                isGranted = YES;
            }
                break;
                
            default:
                break;
        }
        return isGranted;
    }
    

    4.实现代理,将选中照片回调

    #pragma mark - UIImagePickerControllerDelegate
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
    {
        //获取编辑后的图片
        UIImage *image = info[@"UIImagePickerControllerEditedImage"];
        if (!image) {
            image = info[UIImagePickerControllerOriginalImage];
        }
        NSLog(@"DELEGATE %@",image);
        if (self.photoBlock) {
            self.photoBlock(image);
        }
        [_picker dismissViewControllerAnimated:YES completion:nil];
    }
    
    // 取消选择照片:
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
        NSLog(@"取消图片选择");
        [picker dismissViewControllerAnimated:YES completion:nil];
        
    }
    

    5.使用

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 实例化LJXPhotoAlbum
        _photoAlbum = [[LJXPhotoAlbum alloc] init];
    }
    
    - (IBAction)takePhotoClick:(id)sender {
        // 调用getPhotoAlbumOrTakeAPhotoWithController方法
        [_photoAlbum getPhotoAlbumOrTakeAPhotoWithController:self andWithBlock:^(UIImage *image) {
            self.imageView.image = image;
        }];
    }
    

    代码下载地址

    GitHub地址 点击下载

    相关文章

      网友评论

          本文标题:封装相册选择器(UIImagePickerController)

          本文链接:https://www.haomeiwen.com/subject/okhdhttx.html