iOS开发(相册与相机)——UIImagePickerController实现

相机与相册

1. UIImagePickerController简介

UIImagePickerController类把从iOS设备中获取图片的操作进行了统一封装,使用图片来源进行区分,也就是说,不论从摄像头拍照获取图片,还是从相册选取图片,区别在于图片的获取渠道或者方式不同。

1.1 UIImagePickerController类常用属性与方法

  • 图片获取来源,默认为照片库。UIImagePickerControllerSourceType的取值有三个,分别为UIImagePickerControllerSourceTypePhotoLibrary(照片库)、UIImagePickerControllerSourceTypeCamera(相机)、UIImagePickerControllerSourceTypeSavedPhotosAlbum(相册)
@property (nonatomic) UIImagePickerControllerSourceType sourceType;
  • 设置当拍照完或在相册选完照片后,是否允许编辑图像。
@property(nonatomic) BOOL allowsEditing;
  • 可对图像或者照相机模式进行进一步操作设置的代理
@property (nonatomic, nullable, weak)id<UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;
  • 判断设备是否支持照相机/图片库/相册功能
+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;

1.2 UIImagePickerControllerDelegate代理协议

UIImagePickerControllerDelegate代理协议中提供了用户选择图片后的回调方法,在回调方法中可以获取到用户选择的照片,进而做进一步处理。

  • 用户完成图片选择后回调。在该方法的参数info中可以获取到用户选择的图片信息。由于参数info是一个字典,因此在UIImagePickerController类中定义了相关的键值名称用于获取对应的值
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

2. UIImagePickerController的使用

1.准备工作
预先在Info.plist文件中,添加相机、相册的使用权限。
在这里插入图片描述
在storyBoard中搭建界面,添加一个UIImageView控件并与控制器连线,用于显示选中的图片。另外添加两个Button,一个为拍照,另一个为相册。

2.属性和相关协议
添加UIImagePickerController类型的属性,并设置控制器遵守相关协议。

@interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate,UITextFieldDelegate>
@property (strong, nonatomic) UIImagePickerController *imagePickerController;
@property (weak, nonatomic) IBOutlet UIImageView *photoView;
@property (weak, nonatomic) IBOutlet UIButton *CBtn;
@property (weak, nonatomic) IBOutlet UIButton *PBtn;
@end

3.初始化imagePickerController属性

- (UIImagePickerController*) imagePickerController{
    if (_imagePickerController == nil){
        _imagePickerController = [[UIImagePickerController alloc] init];
        _imagePickerController.delegate = self;
        //允许编辑
        _imagePickerController.allowsEditing = YES;
    }
    return  _imagePickerController;
}

4.当点击拍照按钮时

- (IBAction)CameraBtn:(id)sender {
    
    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeCamera]){
        //权限判断
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
        if (authStatus == AVAuthorizationStatusRestricted ||
            authStatus ==AVAuthorizationStatusDenied){
            //无权限
            NSLog(@"无权限");

        }else{
        	//来源为Camera
            self.imagePickerController.sourceType =
            UIImagePickerControllerSourceTypeCamera;
            self.imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
            [self presentViewController:self.imagePickerController animated:YES completion:nil];
            NSLog(@"点击相机");
        }
    }else{
        NSLog(@"不存在相机");
    }
}

5.当点击相册按钮时

- (IBAction)PhotoBtn:(id)sender {
    NSLog(@"点击相册");
    self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:self.imagePickerController animated:YES completion:nil];
}

6. 回调方法的实现

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    [picker dismissViewControllerAnimated:YES completion:nil];
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    self.photoView.image = image;
}

至此,简单的相机与相册功能就实现了。

3.iOS11以后权限的变化

一、 iOS11之前:访问相册和存储照片到相册(读写权限),需要用户授权,需要添加NSPhotoLibraryUsageDescription。
二、iOS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。添加图片到相册(写权限),需要用户授权,需要添加NSPhotoLibraryAddUsageDescription。
真机调试:现在Xcode开放了真机调试方式,不需要拥有开发者账户就可以,方法现在网上都有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值