效果图:
步骤:
1.配置info.plist文件中调用相机和相册的权限
2.设置弹框添加事件
3.判断并申请权限
4.调起系统相册和相机
直接上代码:
#import "ViewController.h"
#pragma mark - 01.使用相机相册要导入头文件的
#import <AVFoundation/AVFoundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <Photos/Photos.h>
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
#pragma mark - 02.拖线一个imageView控件用来展示选中的图片 & 创建一个弹框;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic, strong) UIImagePickerController *imagePickerController;
@end
@implementation ViewController
#pragma mark - 03.懒加载初始化弹框;
- (UIImagePickerController *)imagePickerController {
if (_imagePickerController == nil) {
_imagePickerController = [[UIImagePickerController alloc] init];
_imagePickerController.delegate = self; //delegate遵循了两个代理
_imagePickerController.allowsEditing = YES;
}
return _imagePickerController;
}
- (void)viewDidLoad {
[super viewDidLoad];
//MARK: - 04.给视图添加手势.(添加手势就是租给那些自己买不起selector的控件一个触发方法);
//首先开启该视图与用户交互的开关.默认是关;
//这个应该是个轻拍手势;
self.imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewIsSelector)];
[self.imageView addGestureRecognizer:tap];
}
#pragma mark - 05.在租来的触发方法里添加事件;
- (void)imageViewIsSelector {
//MARK: - 06.点击图片调起弹窗并检查权限;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *camera = [UIAlertAction actionWithTitle:@"使用相机拍摄" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self checkCameraPermission];//调用检查相机权限方法
}];
UIAlertAction *album = [UIAlertAction actionWithTitle:@"从相册中选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self checkAlbumPermission];//调起检查相册权限方法
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
[self dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:camera];
[alert addAction:album];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
#pragma mark - Camera(检查相机权限方法)
- (void)checkCameraPermission {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusNotDetermined) {
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (granted) {
[self takePhoto];
}
}];
} else if (status == AVAuthorizationStatusDenied || status == AVAuthorizationStatusRestricted) {
[self alertAlbum];//如果没有权限给出提示
} else {
[self takePhoto];//有权限进入调起相机方法
}
}
- (void)takePhoto {
#pragma mark - 07.判断相机是否可用,如果可用调起
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:self.imagePickerController animated:YES completion:^{
}];
} else {//不可用只能GG了
NSLog(@"木有相机");
}
}
#pragma mark - Album(相册流程与相机流程相同,相册是不存在硬件问题的,只要有权限就可以直接调用)
- (void)checkAlbumPermission {
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
dispatch_async(dispatch_get_main_queue(), ^{
if (status == PHAuthorizationStatusAuthorized) {
[self selectAlbum];
}
});
}];
} else if (status == PHAuthorizationStatusDenied || status == PHAuthorizationStatusRestricted) {
[self alertAlbum];
} else {
[self selectAlbum];
}
}
- (void)selectAlbum {
//判断相册是否可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:self.imagePickerController animated:YES completion:^{
}];
}
}
- (void)alertAlbum {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"请在设置中打开相册" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
[self dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
#pragma mark - UIImagePickerControllerDelegate(最后一步,选完就把图片加上就完事了)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
[picker dismissViewControllerAnimated:YES completion:nil];
UIImage *image = [info valueForKey:UIImagePickerControllerEditedImage];
self.imageView.image = image;
}
@end
基本上就大功告成了