IOS开发入门之如何优雅地使用iOS系统相机、相册
白羽 2018-11-30 来源 :网络 阅读 1026 评论 0

摘要:本文将带你了解IOS开发入门如何优雅地使用iOS系统相机、相册,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门如何优雅地使用iOS系统相机、相册,希望本文对大家学IOS有所帮助。



概述

iOS系统相机、相册功能全部依托于图像选取控制器UIImagePickerController,在使用该控制器时,我们需要按照如下步骤进行

检查指定的资源类型是否可用 检查指定资源类型下是否支持指定的媒体类型 检查用户对相机、相册的授权状态 初始化并弹出图像选取控制器 处理操作完成后的代理回调

检查指定的资源类型是否可用

这步操作用于检查设备是否支持指定的资源类型,以防盲目调用图像选取器导致程序不可用,比如采用模拟器调用相机

图像选取控制器的资源类型是一个枚举,拥有如下三种类型


   

UIImagePickerControllerSourceTypeCamera // 相机类型

UIImagePickerControllerSourceTypePhotoLibrary // 照片库类型,相当于系统应用"照片"中的"相簿/Photos"栏加上"照片/Moments"栏

UIImagePickerControllerSourceTypeSavedPhotosAlbum // 照片类型,相当于系统应用"照片"中的"照片/Moments"栏

   

我们可以使用isSourceTypeAvailable方法进行检查


   

// 以"检查图像选择器的相机类型是否可用"为例

 

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

{

  // 相机类型可用

}

else

{

  // 相机类型不可用

}

   

检查指定资源类型下是否支持指定的媒体类型

这步操作用于检查某种资源类型下是否支持某种媒体类型,比如iPhone是否可以拍LivePhoto

图像选取控制器的媒体类型主要分为两大类,图片类型与视频类型


kUTTypeImage(图片类型,细分为kUTTypeJPEG、kUTTypeGIF、kUTTypeLivePhoto等)

kUTTypeMovie(视频类型,细分为kUTTypeMovie、kUTTypeMP3、kUTTypeAVIMovie等)

   

 

注1: 媒体类型以常量形式定义,需要引入MobileCoreServices.framework

 

注2: 媒体类型常量是CFString类型,在使用时需要强转为NSString类型

我们可以使用availableMediaTypesForSourceType:方法返回指定资源类型下支持的媒体类型数组


   

// 以"检查图像选择器在相机类型下是否支持图片类型"为例

 

// 返回相机类型下支持的媒体类型数组

NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

// 判断数组中是否拥有(NSString *)kUTTypeImage元素

if ([availableMediaTypes containsObject:(NSString *)kUTTypeImage])

{

  // 图片类型可用

}

else

{

  // 图片类型不可用

}

   

检查用户对相机、相册的授权状态

这步操作根据用户授权状态决定是否弹出图像选取控制器,比如用户授权状态为拒绝状态,那么便需要提示用户,而不是弹出一个黑屏的控制器

检查用户对相机的授权状态

 

注: 需要引入AVFoundation.framework

相机媒体类型主要有两种常用类型


   

AVMediaTypeVideo(视频媒体类型)

AVMediaTypeAudio(音频媒体类型)

   

用户对相机的授权状态是一个枚举,拥有如下四种类型


AVAuthorizationStatusNotDetermined // 用户没有选择是否授权使用

AVAuthorizationStatusRestricted // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能

AVAuthorizationStatusDenied // 用户已经禁止使用

AVAuthorizationStatusAuthorized // 用户已经授权使用

   

我们可以使用authorizationStatusForMediaType:方法返回用户对指定的相机媒体类型的授权状态


   

// 以"检查用户对视频媒体类型的授权状态"为例

 

// 返回用户对视频媒体类型的授权状态

AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

// 处理不同授权状态下的操作流程

switch (authorizationStatus)

{

  case AVAuthorizationStatusNotDetermined:

  {

    // 用户没有选择是否授权使用

  }

  break;

case AVAuthorizationStatusRestricted:

  {

    // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能

  }

  break;

  case AVAuthorizationStatusDenied:

  {

    // 用户已经禁止使用

  }

  break;

  case AVAuthorizationStatusAuthorized:

  {

    // 用户已经授权使用

  }

  break;

}

   

在相机授权状态为AVAuthorizationStatusNotDetermined时,我们有必要先利用requestAccessForMediaType:completionHandler:方法来弹窗要求用户选择是否授权,而非直接弹出图像选取控制器,由系统自动弹窗询问用户是否授权


   

// 以"弹窗要求用户选择是否授权"为例

 

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

    if(granted)

    {

        // 用户授权使用

    }

    else

    {

        // 用户禁止使用

    }

}];

   

 

注1: 该弹窗只在授权状态为AVAuthorizationStatusNotDetermined时才会显示

 

注2: 在使用AVCaptureDeviceInput且授权状态为AVAuthorizationStatusNotDetermined时,该弹窗会自动显示

检查用户对相册的授权状态

 

注: 需要引入AssetsLibrary.framework

用户对相册的授权状态是一个枚举,拥有如下四种类型


   

ALAuthorizationStatusNotDetermined // 用户没有选择是否授权使用

ALAuthorizationStatusRestricted // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能

ALAuthorizationStatusDenied // 用户已经禁止使用

ALAuthorizationStatusAuthorized // 用户已经授权使用

   

我们可以使用authorizationStatus方法返回用户对相册的授权状态


   

// 以"检查用户对相册的授权状态"为例

 

// 返回用户对相册的授权状态

ALAuthorizationStatus authorizationStatus = [ALAssetsLibrary authorizationStatus];

// 处理不同授权状态下的操作流程

switch (authorizationStatus)

{

  case ALAuthorizationStatusNotDetermined:

  {

    // 用户没有选择是否授权使用

  }

  break;

  case ALAuthorizationStatusRestricted:

  {

    // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能

  }

  break;

  case ALAuthorizationStatusDenied:

  {

    // 用户已经禁止使用

  }

  break;

  case ALAuthorizationStatusAuthorized:

  {

    // 用户已经授权使用

  }

  break;

}

   

初始化并弹出图像选取控制器

初始化相机控制器


   

// 创建图像选取控制器对象

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

// 将资源类型设置为相机类型

picker.sourceType = UIImagePickerControllerSourceTypeCamera;

// 将媒体类型设置为图片类型和视频类型(数组中如果只写一个,图像选择控制器即只允许拍照/录像)

picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];

// 设置拍照后的图片允许编辑

picker.allowsEditing = YES;

// 设置摄像图像品质,默认是UIImagePickerControllerQualityTypeMedium

picker.videoQuality = UIImagePickerControllerQualityTypeHigh;

// 设置最长摄像时间,默认是10秒

picker.videoMaximumDuration = 30;

// 设置代理,需要遵守<uinavigationcontrollerdelegate, uiimagepickercontrollerdelegate="">两个协议

picker.delegate = self;

// 弹出图像选取控制器

[self presentViewController:picker animated:YES completion:nil];</uinavigationcontrollerdelegate,>

   

初始化相册控制器


   

// 创建图像选取控制器对象

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

// 将资源类型设置为相册类型

picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

// 将媒体类型设置为图片类型和视频类型(数组中如果只写一个,图像选择控制器即只能选取图片/视频)

picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];

// 设置选取后的图片允许编辑

picker.allowsEditing = YES;

// 设置代理,需要遵守<uinavigationcontrollerdelegate, uiimagepickercontrollerdelegate="">两个协议

picker.delegate = self;

// 弹出图像选取控制器

[self presentViewController:picker animated:YES completion:nil];</uinavigationcontrollerdelegate,>

   

处理操作完成后的代理回调

在对相机、相册操作完成后,系统会回调如下两个代理方法



   

// 操作完成

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<nsstring id=""> *)info

{

  // do something ...

 

  // 回收图像选取控制器

  [picker dismissViewControllerAnimated:YES completion:nil];

}

 

// 操作取消

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

{

  // 回收图像选取控制器

  [picker dismissViewControllerAnimated:YES completion:nil];

}</nsstring>

   

在操作完成回调info字典中,拥有如下可用信息

<a href="#" class="toolbar_item    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程