ios学习笔记——UIImagePickerController

1、UIImagePickerController初始化

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

2、设置属性

  1)sourceType属性:数据的来源,有三种来源:

    enum {
       UIImagePickerControllerSourceTypePhotoLibrary,        // 图库
       UIImagePickerControllerSourceTypeCamera,       // 相机
       UIImagePickerControllerSourceTypeSavedPhotosAlbum  // 相册
    };
    typedef NSUInteger UIImagePickerControllerSourceType;

  2)allowsEditing属性:是否允许剪切

  3)设置代理deleage

  4)  mediaTypes属性:为UIImagePickerViewController指定媒体类型(数组),默认包含kUTTypeImage,所以拍照时可以不用设置,但是录像的时候必须设置,可以设置为kUTTypeVideo(不带声音)或者kUTTypeMovie(视频并带有声音)

    设置媒体类型:

1 picker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeMovie, nil];

    如果想包含所有媒体,可以使用下面方法:

1 picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

    

   5)  videoQuality属性:视频质量,一个枚举类型。

1 enum {
2         UIImagePickerControllerQualityTypeHigh            = 0,  //高清
3         UIImagePickerControllerQualityTypeMedium          = 1,  // default value
4         UIImagePickerControllerQualityTypeLow             = 2,  //低质量,适用于蜂窝网传输
5         UIImagePickerControllerQualityType640x480         = 3,
6         UIImagePickerControllerQualityTypeIFrame1280x720  = 4,
7         UIImagePickerControllerQualityTypeIFrame960x540   = 5
8     };
9     typedef NSUInteger UIImagePickerControllerQualityType;

   6)  videoMaximumDuration属性:录制视频的最长时间,默认长度为10分钟。

   7) showsCameraControls属性:是否显示摄像头控制面板,默认为YES。

3、显示UIImagePickerController

  [self presentViewController:self.pickerController animated:YES completion:nil];

4、实现代理函数

  - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info

  - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

  如果实现了imagePickerControllerDidCancel函数,那么我们点击cancel按钮时,失效,所以我们要在这个函数里调用

  [picker dismissViewControllerAnimated:YES completion:nil];

简单实现拍照、录像,并从相册中取照片和视频:

SJZPhotoViewController.h

 1 #import <UIKit/UIKit.h>
 2 
 3 @protocol SJZPhotoViewControllerDelegate <NSObject>
 4 
 5 @optional
 6 - (void)getPhotoFromXiangce:(UIImage *)image;
 7 - (void)getVideoFromXiangce:(NSURL *)strURL;
 8 @end
 9 
10 @interface SJZPhotoViewController : UIViewController
11 
12 @property (nonatomic, weak) UIViewController * parentController;
13 @property (nonatomic, weak) id<SJZPhotoViewControllerDelegate> delegate;
14 @property (nonatomic, assign) CGFloat imageSale;
15 
16 
17 - (void)addPhotoActionSheet;
18 - (void)addVideoActionSheet;
19 @end

 SJZPhotoViewController.m

  1 #import "SJZPhotoViewController.h"
  2 #import <MobileCoreServices/UTCoreTypes.h>
  3 
  4 @interface SJZPhotoViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
  5 
  6 @end
  7 
  8 @implementation SJZPhotoViewController
  9 
 10 - (void)viewDidLoad {
 11     [super viewDidLoad];
 12     
 13     
 14 }
 15 
 16 - (void)addVideoActionSheet
 17 {
 18     UIAlertController * alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 19     
 20     UIAlertAction * videoAction = [UIAlertAction actionWithTitle:@"录制视频" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 21         [self actionsheetForVideofromXiangji];
 22     }];
 23     [alert addAction:videoAction];
 24     
 25     UIAlertAction * action = [UIAlertAction actionWithTitle:@"从相册选取" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 26         [self aciontSheetForVideoFromXiangce];
 27     }];
 28     
 29     [alert addAction:action];
 30     
 31     UIAlertAction * cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 32         
 33     }];
 34     [alert addAction:cancleAction];
 35     
 36     [self.parentController presentViewController:alert animated:YES completion:^{
 37         
 38     }];
 39     
 40 }
 41 
 42 //从相册取视频
 43 - (void)aciontSheetForVideoFromXiangce
 44 {
 45     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
 46         UIImagePickerController * picker = [[UIImagePickerController alloc] init];
 47         picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
 48         //设置媒体类型
 49         picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
 50         picker.delegate = self;
 51         
 52         [self.parentController presentViewController:picker animated:YES completion:^{
 53             
 54         }];
 55     }
 56 }
 57 
 58 //录像
 59 - (void)actionsheetForVideofromXiangji
 60 {
 61     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
 62         //判断后置摄像头是否可用
 63         if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]){
 64             UIImagePickerController * picker = [[UIImagePickerController alloc] init];
 65             picker.sourceType = UIImagePickerControllerSourceTypeCamera;
 66             picker.delegate = self;
 67             
 68             //设置媒体类型,需要包括视频媒体类型
 69             picker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeMovie, nil];
 70             
 71             [self.parentController presentViewController:picker animated:YES completion:^{
 72                 
 73             }];
 74         }
 75     }
 76 }
 77 
 78 - (void)addPhotoActionSheet
 79 {
 80     UIAlertController * alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 81     
 82     UIAlertAction * action = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 83         [self actionSheetForImageFromXiangji];
 84     }];
 85     [alert addAction:action];
 86     
 87     UIAlertAction * action1 = [UIAlertAction actionWithTitle:@"从相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
 88         [self aciontSheetForImageFromXiangce];
 89     }];
 90     [alert addAction:action1];
 91     
 92     UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 93         
 94     }];
 95     [alert addAction:cancelAction];
 96     
 97     [self.parentController presentViewController:alert animated:YES completion:nil];
 98 }
 99 
100 //从相册区图片
101 - (void)aciontSheetForImageFromXiangce
102 {
103     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
104         UIImagePickerController * picker = [[UIImagePickerController alloc] init];
105         picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
106         picker.delegate = self;
107         [self.parentController presentViewController:picker animated:YES completion:^{
108         }];
109     }
110 }
111 
112 //相机拍照
113 - (void)actionSheetForImageFromXiangji
114 {
115     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
116         UIImagePickerController * pick = [[UIImagePickerController alloc] init];
117         pick.sourceType = UIImagePickerControllerSourceTypeCamera;
118         pick.delegate = self;
119         
120         [self.parentController presentViewController:pick animated:YES completion:^{
121         }];
122     }
123 }
124 
125 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
126 {
127     NSString * meidaType = [info objectForKey:UIImagePickerControllerMediaType];
128     if([meidaType isEqualToString:@"public.image"]){
129         UIImage * image = [info objectForKey:UIImagePickerControllerOriginalImage];
130         //在这里可以对图片进行处理(比如压缩)
131         if(self.imageSale > 0){
132             NSData * photoData = UIImageJPEGRepresentation(image, self.imageSale);
133             image = [UIImage imageWithData:photoData];
134         }
135         
136         if([self.delegate respondsToSelector:@selector(getPhotoFromXiangce:)]){
137             [self.delegate getPhotoFromXiangce:image];
138         }
139     }else if([meidaType isEqualToString:(NSString *)kUTTypeMovie]){
140         //获取视频文件的url
141         NSURL * mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
142         
143         if([self.delegate respondsToSelector:@selector(getVideoFromXiangce:)]){
144             [self.delegate getVideoFromXiangce:mediaURL];
145         }
146     }
147     
148     [self.parentController dismissViewControllerAnimated:YES completion:nil];
149 }
150 
151 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
152 {
153     [self.parentController dismissViewControllerAnimated:YES completion:^{
154         
155     }];
156 }
157 
158 @end

 demo地址:https://github.com/sjzlovecj/SJZPhotoView

原文地址:https://www.cnblogs.com/sjzlovecj/p/5561802.html