ios基础篇(一)—— UIImagePickerController类

el/2023/6/4 15:22:36

UIImagePickerController简述:

UIImagePickerController 类是获取选择图片和视频的用户接口,我们可以用UIImagePickerController选择我们所需要的图片和视频。

注:UIImagePickerController不能够任意定制,也不可以继承生成子类。

一、UIImagePickerController的属性:

1、sourceType

设置UIImagePicker照片源类型,默认有3种。照片源类型

指定使用模式(照相机/相册/照片库)

enum {
UIImagePickerControllerSourceTypePhotoLibrary,  //照片库(通过同步存放的,用户不能删除)
UIImagePickerControllerSourceTypeCamera,  //照相机
UIImagePickerControllerSourceTypeSavedPhotosAlbum //保存的照片(通过拍照或者截屏保存的,用户可以删除)
};

2、BOOL showsCameraControls

设置拍照时的下方的工具栏是否显示,如果需要自定义拍摄界面,则可把该工具栏隐藏。

3. videoMaximumDuration

设置UIImagePicker的最大视频持续时间.默认10分钟

4. + availableMediaTypesForSourceType: // 指定源可用的媒体种类

 //获得相机模式下支持的媒体类型

NSArray* availableMediaTypes =
[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

3、BOOL allowsEditing

设置当拍照完或在相册选完照片后,是否跳到编辑模式进行图片剪裁即是否允许编辑

showsCameraControls=Yes时才有效果。

[imagePicker setAllowsEditing:YES]; 

4、cameraDevice

使用的镜头(默认后置的)

判断设备是否支持前置摄像头/后置摄像头

enum {UIImagePickerControllerCameraDeviceRear,UIImagePickerControllerCameraDeviceFront};
+ isCameraDeviceAvailable: // 摄像设备是否可用.
+ availableCaptureModesForCameraDevice: // 设备可用的选取模式 

  cameraCaptureMode //相机捕获模式

5、cameraFlashMode

设置闪光灯模式  (默认自动)

 enum {UIImagePickerControllerCameraFlashModeOff  = -1,UIImagePickerControllerCameraFlashModeAuto = 0,UIImagePickerControllerCameraFlashModeOn   = 1};
 + isFlashAvailableForCameraDevice: // 是否有闪光能力

6、mediaTypes

设置相机支持的类型,拍照和录像

+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType
  • UIImageWriteToSavedPhotosAlbum保存图像,
  • UISaveVideoAtPathToSavedPhotosAlbum保存视频.
  • 4.0后使用writeImageToSavedPhotosAlbum:metadata:completionBlock:保存元数据.

一共有三个可选的代理方法UIImagePickerControllerDelegate 

– imagePickerController:didFinishPickingMediaWithInfo:  
– imagePickerControllerDidCancel:  
– imagePickerController:didFinishPickingImage:editingInfo: 
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info

info中包括选取的照片,视频的主要信息

NSString *const UIImagePickerControllerMediaType;       选取的类型 public.image  public.movie
NSString *const UIImagePickerControllerOriginalImage;    修改前的UIImage object.
NSString *const UIImagePickerControllerEditedImage;    修改后的UIImage object.
NSString *const UIImagePickerControllerCropRect;原始图片的尺寸NSValue object containing a CGRect data type
NSString *const UIImagePickerControllerMediaURL;     视频在文件系统中 的 NSURL地址

7、cameraViewTransform

设置拍摄时屏幕的view的transform属性,可以实现旋转,缩放功能

enum{CGAffineTransformMakeRotation;CGAffineTransformMakeScale;}

二、UIImagePickerController回调方法:

1、成功获得相片或视频后的回调

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{//通过UIImagePickerControllerMediaType判断返回的是照片还是视频NSString* type = [info objectForKey:UIImagePickerControllerMediaType];//如果返回的type等于kUTTypeImage,代表返回的是照片,并且需要判断当前相机使用的sourcetype是拍照还是相册if ([type isEqualToString:(NSString*)kUTTypeImage]&&picker.sourceType==UIImagePickerControllerSourceTypeCamera) {//获取照片的原图UIImage* original = [infoobjectForKey:UIImagePickerControllerOriginalImage];//获取图片裁剪的图UIImage* edit = [info objectForKey:UIImagePickerControllerEditedImage];//获取图片裁剪后,剩下的图UIImage* crop = [info objectForKey:UIImagePickerControllerCropRect];//获取图片的urlNSURL* url = [info objectForKey:UIImagePickerControllerMediaURL];//获取图片的metaData数据信息NSDictionary* metaData = [info objectForKey:UIImagePickerControllerMediaMetadata];//如果是拍照的照片,则需要手动保存到本地,系统不会自动保存拍照成功后的照片UIImageWriteToSavedPhotosAlbum(edit, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);}else{}//模态方式退出uiimagepickercontroller[imagepicker dismissModalViewControllerAnimated:YES];}

2、取消照相机的回调

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{//模态方式退出UIImagePickerController[imagePicker dismissModalViewControllerAnimated:YES];
}

UIImagePickerController小例子

UIImagePickerController的代理需要遵守这两个协议.<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

#pragma mark 选择照片

- (void)selectPhoto{// 1. 首先判断照片源是否可用if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {// 0)实例化控制器UIImagePickerController *picker = [[UIImagePickerController alloc]init];// 1)设置照片源[picker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];// 2) 设置允许修改[picker setAllowsEditing:YES];// 3) 设置代理[picker setDelegate:self];// 4) 显示控制器[self presentViewController:picker animated:YES completion:nil];} else {NSLog(@"照片源不可用");}
}

#pragma mark - imagePicker代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{UIImage *image = info[@"UIImagePickerControllerEditedImage"];[_imageButton setImage:image forState:UIControlStateNormal];    // 关闭照片选择器[self dismissViewControllerAnimated:YES completion:nil];    // 需要将照片保存至应用程序沙箱,由于涉及到数据存储,同时与界面无关// 可以使用多线程来保存图像dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{     // 保存图像// 1. 取图像路径NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *imagePath = [docs[0]stringByAppendingPathComponent:@"abc.png"];// 2. 转换成NSData保存NSData *imageData = UIImagePNGRepresentation(image);[imageData writeToFile:imagePath atomically:YES];});
}

UIImagePicker使用步骤:

  1.     检查指定源是否可用. isSourceTypeAvailable:方法.
  2.     检查可用媒体(视频还是只能是图片) availableMediaTypesForSourceType:方法.
  3.     设置界面媒体属性mediaTypes property.
  4.     显示界面使用presentViewController:animated:completion:方法.iPad中是popover形式.需要确保sourceType有效.
  5.     相关操作,移除视图.


如果想创建一个完全自定义界面的image picker来浏览图片,使用 Assets Library Framework Reference中的类. (AV Foundation Programming Guide 中的 “Media Capture and Access to Camera” )

参考:https://www.jianshu.com/p/966a3b9a72be

http://www.ngui.cc/el/3419356.html

相关文章

ios基础篇(二)—— UITableView

基本 API 解释以及用法 数据源 UITableViewDataSource代理 UITableViewDelegateUITableViewCell一些常用操作UITableView 进阶 性能优化优雅的使用 UITableView 之链式编程UITableView 相关的开源库 MJRefresh 上拉下拉刷新组件UITableViewFDTemplateLayoutCell 自动计算行高SW…

ios基础篇(六)—— 代理协议消息传递机制、 NSTimer计时器

代理协议机制在iOS开发中&#xff0c;是非常常用的一种消息传递机制&#xff0c;主要用于子视图向父视图传递数据&#xff0c;代理协议是单向消息传递。 要使用代理协议&#xff0c;需要以下几个步骤&#xff1a; 1.子视图控制器中需要做如下操作&#xff1a; 1.1在子视图控制…

ios基础篇(三)—— UITextField、UITextView

一、UITextField —— 文本框控件 作用&#xff1a;供用户输入或编辑文本 属性&#xff1a; text属性&#xff1a;获得或设置文本框中的文字 使用文本框控件时需要注意几项事情&#xff1a; 在输入不同类型的文本时&#xff0c;需要注意键盘的类型&#xff0c;譬如输入QQ号…

ios基础篇(五)—— UIDatePicker UIPickerView、UIPageControl、UIActivityIndicatorView

一、UIDatePicker && UIPickerView UIDatePicker&#xff08;日期选择器&#xff09;只有这四种模式&#xff1a; typedef NS_ENUM(NSInteger, UIDatePickerMode) {UIDatePickerModeTime, // Displays hour, minute, and optionally AM/PM designation …

ios基础篇(四)—— Foundation框架

凡是带有Mutable字样的类型&#xff0c;都是可变的&#xff0c;如果存在相对应的没有Mutable字样的类型&#xff0c;都是不可变的&#xff0c;一旦初始化之后&#xff0c;就不可以再修改。 一、NSString和NSMutableString 1.1 字符串转数字 integerValue 1.2 字符串常用方法…

小项目(一)—— QQ框架 UITabBarController静态单元格、Modal

UITabBarController 跟UINavigationController类似&#xff0c;UITabBarController也可以轻松地管理多个控制器&#xff0c;轻松完成控制器之间的切换&#xff0c;典型例子就是QQ、微信等应用 UITabBarController的简单使用 UITabBarController的使用步骤 初始化UITabBarCon…

ios基础篇(五)—— Quartz2D

一、Quartz2D Quartz 2D是一个二维绘图引擎&#xff0c;同时支持iOS和Mac OS X系统&#xff08;跨平台&#xff0c;纯 C 语言的&#xff09;。包含在 Core Graphics 框架中。 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 微博图片上的水印绘制\生…

ios基础篇(六)—— Quartz2D 饼状图、柱状图

一、绘制“饼状图” 思路&#xff1a; 构建数据&#xff0c;NSArray *data [30, 15, 5, 17, 3, 10, 20];。根据数据个数绘制“扇形”&#xff08;弧&#xff09; 注意&#xff1a; 每个弧的起始、结束弧度都是不一样的 每次绘制完毕一个弧以后都要重新设置下一次的起始弧度…

ios基础篇(七)—— 矩阵操作、图形上下文栈、Quartz2D的内存管理、绘制、图片裁剪

一、矩阵操作 - 仿射变换 缩放 void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)旋转 void CGContextRotateCTM(CGContextRef c, CGFloat angle)平移 void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty) #import "HMView.h"impl…

ios基础篇(九)—— 手势识别

UIGestureRecognizer: 手势识别器 能轻松识别用户在某个view上面做的一些常见手势 UIGestureRecognizer 是一个抽象类,定义了所有手势的基本行为&#xff0c;使用它的子类才能处理具体的手势 UIPanGestureRecognizer&#xff08;拖动&#xff09; UIPinchGestureRecognizer&a…