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