基于 UIImagePickerController 的拓展封装 - iOS
基于 UIImagePickerController 的拓展,分别支持调用相机、相册的功能,其中相机可以设置默认调用前后摄像头;
简单对此进行了封装和实现,其中还有很多点可以继续挖掘和优化,该版本具体 code 如下:
声明:
/*
相机管理
*/ #import <Foundation/Foundation.h> @protocol YHCameraManagerDelegate <NSObject> /** 事件回调*/
- (void)YHCameraCallBack:(UIImage *)image; @end @interface YHCameraManager : NSObject @property (nonatomic, assign) id <YHCameraManagerDelegate> delegate; /** 单例对象*/
+ (instancetype)shareInstance; /**
调用相机或相册 @param deviceType 摄像头设备类型(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param controller 当前 VC 控件
*/
- (void)openCameraOrPhotoLibraryWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller; /**
调用相机拍照 @param deviceType 摄像头设备类型(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param controller 当前 VC 控件
*/
- (void)openCameraWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller; /**
调用相机拍摄
@param deviceType deviceType 摄像头设备类型(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param controller controller 当前 VC 控件
*/
- (void)openCameraVideoWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller; /**
调用相册
@param controller 当前 VC 控件
*/
- (void)openPhotoLibraryWithController:(UIViewController *)controller; @end
实现:
#import "YHCameraManager.h"
#import <AssetsLibrary/AssetsLibrary.h>// 资源库 @interface YHCameraManager () <UIImagePickerControllerDelegate,UINavigationControllerDelegate> @end @implementation YHCameraManager #pragma mark - ****************************** Base
+ (instancetype)shareInstance {
static YHCameraManager *singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singleton = [[YHCameraManager alloc] init];
}); return singleton;
} #pragma mark - ****************************** Interface methods
/**
调用相机或相册(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param deviceType 摄像头设备类型
@param controller 当前 VC 控件
*/
- (void)openCameraOrPhotoLibraryWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller {
UIAlertController *alertCon = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet]; kWeakSelf(self);
[alertCon addAction:[UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [weakself openCameraWithCameraDeviceType:deviceType AndController:controller]; }]];
[alertCon addAction:[UIAlertAction actionWithTitle:@"从相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[weakself openPhotoLibraryWithController:controller]; }]]; [alertCon addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }]]; [controller presentViewController:alertCon animated:YES completion:^{ }];
} /**
调用相机拍照(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param deviceType 摄像头设备类型
@param controller 当前 VC 控件
*/
- (void)openCameraWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller {
// 判断是否可以打开照相机
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController *pickerCon = [[UIImagePickerController alloc] init];
pickerCon.delegate = self;
pickerCon.allowsEditing = YES;// 设置拍摄的照片是否允许编辑 // 摄像头
pickerCon.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerCon.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;// 设置拍照类型(拍照 & 摄像)
if ([deviceType isEqualToString:@"Front"]) {// 设置使用手机摄像头类型
pickerCon.cameraDevice = UIImagePickerControllerCameraDeviceFront;// 设置使用手机前置摄像头
}
else {
pickerCon.cameraDevice = UIImagePickerControllerCameraDeviceRear;// 设置使用手机后置摄像头
} [controller presentViewController:pickerCon animated:YES completion:^{
NSLog(@"调用了 --- 摄像头");
}];
}
else {
[MBProgressHUD showCommonHudWithAlertString:@"没有摄像头" afterDelay:2.0 toView:controller.view];
}
} /**
调用相机拍摄 @param deviceType deviceType 摄像头设备类型(默认后置摄像头,前置摄像头需将 deviceType 初始值设置为 @"Front")
@param controller controller 当前 VC 控件
*/
- (void)openCameraVideoWithCameraDeviceType:(NSString *)deviceType AndController:(UIViewController *)controller {
// 判断是否可以打开照相机
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController *pickerCon = [[UIImagePickerController alloc] init];
pickerCon.delegate = self;
pickerCon.allowsEditing = YES;// 设置拍摄的照片是否允许编辑 // 摄像头
pickerCon.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerCon.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];// 将 mediaType 设置为所有支持的媒体类型
pickerCon.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;// 设置拍照类型(拍照 & 摄像)
pickerCon.videoQuality = UIImagePickerControllerQualityTypeHigh;// 设置拍摄视频的清晰度
if ([deviceType isEqualToString:@"Front"]) {// 设置使用手机摄像头类型
pickerCon.cameraDevice = UIImagePickerControllerCameraDeviceFront;// 设置使用手机前置摄像头
}
else {
pickerCon.cameraDevice = UIImagePickerControllerCameraDeviceRear;// 设置使用手机后置摄像头
} [controller presentViewController:pickerCon animated:YES completion:^{
NSLog(@"调用了 --- 摄像头");
}];
}
else {
[MBProgressHUD showCommonHudWithAlertString:@"没有摄像头" afterDelay:2.0 toView:controller.view];
}
} /**
调用相册 @param controller 当前 VC 控件
*/
- (void)openPhotoLibraryWithController:(UIViewController *)controller {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.allowsEditing = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate = self; [controller presentViewController:imagePicker animated:YES completion:^{
NSLog(@"调用了 --- 相册");
}];
}
else {
[MBProgressHUD showCommonHudWithAlertString:@"无法打开相册" afterDelay:2.0 toView:controller.view];
}
} #pragma mark - UIImagePickerControllerDelegate
/**
拍照完成回调
@param picker 控件
@param info 数据
*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
NSLog(@"UIImagePickerControllerDelegate --- FinishPickingMedia"); // 获取拍摄数据的类型(照片 or 视频)
// NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; if (picker.sourceType == UIImagePickerControllerSourceTypeCamera || picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {// 图片 [mediaType isEqualToString:(NSString *)kUTTypeImage]
UIImage *theImg = nil;
if ([picker allowsEditing]) {// 判断图片是否允许修改
// 获取用户编辑之后的图像
theImg = [info objectForKey:UIImagePickerControllerEditedImage];
}
else {// 获取原图
theImg = [info objectForKey:UIImagePickerControllerOriginalImage];
} // 保存图片至相册中
UIImageWriteToSavedPhotosAlbum(theImg, self, nil, nil); // 图片后续处理相关
if ([self.delegate respondsToSelector:@selector(YHCameraCallBack:)]) {
[self.delegate YHCameraCallBack:theImg];
}
}
else {// 视频
// 获取视频文件 url
NSURL *urlMedia = [info objectForKey:UIImagePickerControllerMediaType];
// 创建 ALAssetsLibrary 对象并将视频保存到媒体库
ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
// 将视频保存至相册
[assetsLib writeVideoAtPathToSavedPhotosAlbum:urlMedia completionBlock:^(NSURL *assetURL, NSError *error) {
if (error) {
NSLog(@"视频拍摄 --- 写入失败:%@", error);
}
else {
NSLog(@"视频拍摄 --- 写入成功");
}
}];
} [picker dismissViewControllerAnimated:YES completion:^{ }];
} /**
拍照页面取消选择的时候,调用该方法
@param picker 当前控件
*/
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:^{ }];
} @end
以上便是此次的分析内容,还望大神多多指教!
基于 UIImagePickerController 的拓展封装 - iOS的更多相关文章
- 封装ios静态库碰到的一些问题(一)
封装IOS动态库,碰到的第一个问题,就是资源文件的问题,如果将你的程序封装成为静态库,那么静态库中不会包含资源文件和xib文件,这个时候就需要自己封装bundle文件了,而笔者开发环境默认是xcode ...
- Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)
csdn :码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51958010 RetrofitClient 基于Retrofit2 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- 基于PhoneGap3.4框架的iOS插件的实现
Phonegap 提供了iOS 设备的基础特性接口来供HTML页面调用,可是这些基础接口不能满足我们的一些特殊需求,所以有时候我们须要开发插件来扩展其功能. 基于PhoneGap3.4框架的iOS插件 ...
- 简单的基于promise的ajax封装
基于promise的ajax封装 //调用方式: /* ajaxPrmomise({ url:, method:, headers:{} }).then(res=>{}) */ ;(functi ...
- C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装
基于Oracle.ManagedDataAccess.Client封装的Oracle工具类OracleHelper,代码如下: using System; using System.Data; usi ...
- 基于EFCore3.0+Dapper 封装Repository
Wei.Repository 基于EFCore3.0+Dapper 封装Repository,实现UnitOfWork,提供基本的CURD操作,可直接注入泛型Repository,也可以继承Repos ...
- 基于Ant Design Vue封装一个表单控件
开源代码 https://github.com/naturefwvue/nf-vue3-ant 有缺点本来是写在最后的,但是博文写的似乎有点太长了,估计大家没时间往下看,于是就把有缺点写在前面了,不喜 ...
- iOS开发之网络请求(基于AFNetworking的再封装)
最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...
随机推荐
- iis6、iis7、apache设置mime类型
1.IIS6添加方法. 打开iis,展开网站,右键要设置的站点--属性.找到“http头”选项卡--mime类型 进行设置添加. 截图以.ipa mime类型举例. 2.IIS7(iis7.5.iis ...
- 10、选择框:ion-select
!重点 multiple="true" 控制 选择框是 多选还是单选.true为 多选类似 checkbox. /* ---html----*/ <ion-content p ...
- 初学Hadoop之计算TF-IDF值
1.词频 TF(term frequency)词频,就是该分词在该文档中出现的频率,算法是:(该分词在该文档出现的次数)/(该文档分词的总数),这个值越大表示这个词越重要,即权重就越大. 例如:一篇文 ...
- node会话管理——cookie-parser
cookie是由服务器发送给客户端(浏览器)的小量信息. 我们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接.这时我们就需要一个一直保持会话 ...
- NIOSocket Server Client
最近在看Netty框架,顺便写了一下NIO SocketChannel服务端和客户端 Server.java import java.io.IOException; import java.net.I ...
- 引爆你的Javascript代码进化 (转)
转自 海玉的博客 方才在程序里看到一段JS代码,写法极为高明,私心想着若是其按照规范来写,定可培养对这门语言的理解,对JS编程能力提高必是极好的.说人话:丫代码写的太乱,看的窝火! 最近闲暇无事,准备 ...
- js变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级
原文出自:http://www.cnblogs.com/xxcanghai/p/5189353.html作者:小小沧海 题目如下: function Foo() { getName = functio ...
- 用js md5加密
/* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as d ...
- 关于httpclient的终结
End of life 关于Commons HttpClient项目现在已经结束,不再开发.它已经被HttpClient和HttpCore模块中的ApacheHttpComponents项目所取代,新 ...
- 分布式check_mk切换远端图片到本地访问
http://hermannsspace.de/wp/collect-pnp4nagios-data-in-check_mk-distributed-environment slave1数据目录 /o ...