文章目录
相机与相册
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开放了真机调试方式,不需要拥有开发者账户就可以,方法现在网上都有。