UIImagePickerController 相关
UIImagePickerController是系统封装好的一个导航视图控制器,使用其开发者可以十分方便的进行相机相册相关功能的调用。UIImagePickerController继承于UINavigationController,其通过代理的方式将用户获取的图片或者视频文件传入给开发者。
二、UIImagePickerController中属性与方法的应用
在使用UIImagePickerController之前,应该先判断设备做支持的媒体文件获取类型,使用如下方法进行判断:
//判断是否支持某个数据提供类型
/*
UIImagePickerControllerSourceType枚举定义如下:
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
//系统图库
UIImagePickerControllerSourceTypePhotoLibrary,
//相机
UIImagePickerControllerSourceTypeCamera,
//系统相册
UIImagePickerControllerSourceTypeSavedPhotosAlbum
} __TVOS_PROHIBITED;
*/
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;
//判断某个数据提供者所支持的文件格式
/*
文件格式定义在<MobileCoreServices/MobileCoreServices.h>框架中
*/
+ (nullable NSArray<NSString *> *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType;
//判断所支持的相机设备
/*
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
//前置摄像头
UIImagePickerControllerCameraDeviceRear,
//后置摄像头
UIImagePickerControllerCameraDeviceFront
} __TVOS_PROHIBITED;
*/
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0);
//判断对闪光灯的支持
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0);
//判断相机设备支持的媒体模式
/*
返回值为如下枚举:
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
//照片模式
UIImagePickerControllerCameraCaptureModePhoto,
//视频模式
UIImagePickerControllerCameraCaptureModeVideo
} __TVOS_PROHIBITED;
*/
+ (nullable NSArray<NSNumber *> *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0);
上面提到的定义于<MobileCoreServices/MobileCoreServices.h>框架中的文件类型,列举如下:
//图片类型
extern const CFStringRef kUTTypeImage __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
//JPEG格式
extern const CFStringRef kUTTypeJPEG __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
//JPEG2000格式
extern const CFStringRef kUTTypeJPEG2000 __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeTIFF __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypePICT __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeGIF __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypePNG __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeQuickTimeImage __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeAppleICNS __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeBMP __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeICO __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeRawImage __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeScalableVectorGraphics __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeLivePhoto __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_9_1);
//视频格式
extern const CFStringRef kUTTypeAudiovisualContent __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeMovie __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeVideo __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeAudio __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeQuickTimeMovie __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeMPEG __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeMPEG2Video __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeMPEG2TransportStream __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeMP3 __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeMPEG4 __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeMPEG4Audio __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeAppleProtectedMPEG4Audio __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
extern const CFStringRef kUTTypeAppleProtectedMPEG4Video __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeAVIMovie __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeAudioInterchangeFileFormat __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeWaveformAudio __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
extern const CFStringRef kUTTypeMIDIAudio __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0);
CFStringRef与NSString类型的转换,可以使用如下方法:
NSString * str = (__bridge NSString*)kUTTypeMovie;
UIImagePickerController中更多属性与方法解析如下:
//设置代理
@property(nullable,nonatomic,weak) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;
//设置书体提供者类型 默认为图库
@property(nonatomic) UIImagePickerControllerSourceType sourceType;
//设置所需要的数据类型,需要设置为系统定义的文件类型字符串数组 默认为kUTTypeImage
@property(nonatomic,copy) NSArray<NSString *> *mediaTypes;
//设置是否允许编辑图片 设置为YES,则用户选择图片时可以编辑裁剪图片
@property(nonatomic) BOOL allowsEditing;
//设置媒体文件的最大时长 默认为10分钟
@property(nonatomic) NSTimeInterval videoMaximumDuration;
//设置媒体文件的质量 枚举如下:
/*
typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) {
UIImagePickerControllerQualityTypeHigh = 0, // 高质量
UIImagePickerControllerQualityTypeMedium = 1, // 中等质量
UIImagePickerControllerQualityTypeLow = 2, // 低质量
UIImagePickerControllerQualityType640x480 NS_ENUM_AVAILABLE_IOS(4_0) = 3,
UIImagePickerControllerQualityTypeIFrame1280x720 NS_ENUM_AVAILABLE_IOS(5_0) = 4,
UIImagePickerControllerQualityTypeIFrame960x540 NS_ENUM_AVAILABLE_IOS(5_0) = 5,
} __TVOS_PROHIBITED;
*/
@property(nonatomic) UIImagePickerControllerQualityType videoQuality;
//设置是否显示相机控制界面
@property(nonatomic) BOOL showsCameraControls;
//自定义的拍照界面 其会覆盖在原拍照界面上
@property(nullable, nonatomic,strong) __kindof UIView *cameraOverlayView NS_AVAILABLE_IOS(3_1);
//设置拍照界面的transform
@property(nonatomic) CGAffineTransform cameraViewTransform ;
//拍照
- (void)takePicture NS_AVAILABLE_IOS(3_1);
//进行视频捕获
- (BOOL)startVideoCapture NS_AVAILABLE_IOS(4_0);
//停止视频捕获
- (void)stopVideoCapture NS_AVAILABLE_IOS(4_0);
//设置相机捕获模式 照片或视频
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode;
//设置相机设备 前置或后置摄像头
@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice;
//设置闪光灯模式
/*
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
UIImagePickerControllerCameraFlashModeOff = -1, //关闭
UIImagePickerControllerCameraFlashModeAuto = 0, //自动
UIImagePickerControllerCameraFlashModeOn = 1 //开启
} __TVOS_PROHIBITED;
*/
@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode;
三、UIImagePickerControllerDelegate中方法解析
//相机拍照完成或者从图库相册选择相片完成后触发的回调方法 editingInfo字典中将传入编辑信息
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
//相机录像或者从图库相册选择视频完成后触发的回调方法 info字典中是具体信息
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;
//ImagePickerController取消选择是回调的方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
上面方法中的编辑字典与信息字典中,约定好了一些键值对,开发者可以通过相应的键获取需要的信息,规则如下:
//这个键对应NSString类型的值 意义为媒体文件的格式
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType;
//这个键对应UIImage类型的值 意义为获取的原始图片
UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage;
//这个件对应UIIImage类型的值 意义为获取编辑后的图片
UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage;
//这个键对应一个NSValue值 可以转为CGRect类型 意义为编辑的图片范围
UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect;
//这个键对应媒体文件的URL
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL;
//这个键对应图库中的URL
UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL;
//这个键对应一个NSDictionary 里面存放媒体数据
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata;
//现场图片数据 相机捕捉图片时会记录声音
UIKIT_EXTERN NSString *const UIImagePickerControllerLivePhoto;
四、对捕获的图片与视频进行持久化
系统也提供了对相机照片和视频进行存储的方式,列举如下:
//将图片数据存储到相册
void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo);
//将视频保存到相册
BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath);
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo);
参考链接:
1.http://my.oschina.net/u/2340880/blog/710297
2.http://wgh.me/archives/109
UIImagePickerController 相关的更多相关文章
- ELCImagePickerController 的集成
1, 将文件夹ELCImagePicker拷贝到工程中 2,添加系统库AssetsLibrary.framework 3, 添加系统库MobileCoreServices 4,在头文件中加入引用# ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- 整理UIImagePickerController问题
[assetsLibrary addAssetsGroupAlbumWithName:@"iOSDevTip1" resultBlock:^(ALAssetsGroup *grou ...
- iOS10以及xCode8相关资料收集
兼容iOS 10 资料整理笔记 源文:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不 ...
- iOS 10 开发 相机相关的适配
升级 iOS 10 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天在写 Swift 3 相关的一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然 ...
- IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序
前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...
- 捉襟见肘之UIImagePickerController 和自定义照相机
目标:自拍并结合C++算法,识别人脸信息,第一步骤,调用相机并且自定义界面和转场效果 先复习一下 https://developer.apple.com/library/prerelease/tvos ...
- iOS摄像头和相册-UIImagePickerController常用操作
在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频.并且从相册中选取我们需要的图片或者视频. 关于iOS摄像头和相册的应用,可以使用UIImagePickerController类来完成控制. ...
- IOS开发UI基础UIImagePickerController的属性
UIImagePickerController 1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType ...
随机推荐
- 最短路径Shortest Path algorithm
最短路径问题: 如果从图中某一顶点(称为端点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小. (1)Dijkstra 算法 (2) Floyd 算 ...
- Nginx简单配置,部分来源于网络
nginx.conf listener监听端口 server_name监听域名 location{}是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/”.location / { }匹 ...
- iOS 面试大全从简单到复杂(简单篇)
1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上响应 ...
- laravel 邮箱改密功能
参考网址: http://laravelacademy.org/post/1290.html
- sql语句的group by与having子句
准备数据: DROP TABLE IF EXISTS `t_player`; CREATE TABLE `t_player` ( `player_id` int(11) NOT NULL AUTO_I ...
- NSTimer 销毁问题 和 iOS中控制器的释放问题
俗话说的好,前人栽树后人乘凉,最近看了很多博文,不少博文提到了NSTimer的销毁问题, 之前我都没怎么注意,现在对照着文章一一实践发现坑还真不少.下面是我读到的几篇博文分享给大家 @啸笑天的NSTi ...
- C#用Zlib压缩或解压缩字节数组
/// <summary> /// 复制流 /// </summary> /// <param name="input">原始流</par ...
- oracle Database Link
1 Database Link 的创建: 有两个数据库服务器A/B, 其中A的IP地址为172.20.36.245, 服务器B为本机.服务器B上的数据库实例名为ORCL,在本机上的服务监听配置上有服务 ...
- PHP signal 信号
最早写php时,发现在终端执行一个php文件,会一直等待程序执行完成以后,终端才能继续下面的操作,若不小心按了下Ctrl+C会导致php程序退出,闭避免这种情况发生,将会使用php的系统编程,即sig ...
- 《Windows驱动开发技术详解》之驱动程序的基本结构
驱动对象 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并 ...