一、UIImagePickerController的简单介绍

1.UIImagePickerController它可以用来拍照和录制视频,也可以用它进入相簿和照片库,主要是通过设定它的属性(sourceType)拾取源的类型

UIImagePickerControllerSourceTypePhotoLibrary:照片库,默认值
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿

要用UIImagePickerController来拍照或者录制视频通常可以分为如下步骤:

  1. 创建UIImagePickerController对象。
  2. 指定拾取源,如果是拍照或者是录制的话需要指定为摄像头类型,平时选择照片时使用的拾取源是照片库或者相簿
  3. 指定摄像头,前置摄像头或者后置摄像头。
  4. 设置媒体类型mediaType,注意如果是录像必须设置,如果是拍照此步骤可以省略,因为mediaType默认包含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中)
  5. 指定捕获模式,拍照或者录制视频。(视频录制时必须先设置媒体类型再设置捕获模式)
  6. 展示UIImagePickerController(通常以模态窗口形式打开)。
  7. 拍照和录制视频结束后在代理方法中展示/保存照片或视频。

下面看一下常用的方法和属性

//属性:

@property(nonatomic)  UIImagePickerControllerSourceType sourceType   //拾取源

@property(nonatomic,copy)  NSArray *mediaTypes   //媒体类型,默认情况下此数组包含kUTTypeImage,所以拍照时可以不用设置;但是当要录像的时候必须设置,可以设置为kUTTypeVideo(视                             //频,但不带声音)或者kUTTypeMovie(视频并带有声音)

@property(nonatomic)  NSTimeInterval videoMaximumDuration // 视频最大录制时长,默认为10s

@property(nonatomic)  UIImagePickerControllerQualityType videoQuality  //视频质量,枚举类型:
                                      UIImagePickerControllerQualityTypeHigh://高清质量
                                      UIImagePickerControllerQualityTypeMedium://中等质量,适合WiFi传输
                                      UIImagePickerControllerQualityTypeLow://低质量,适合蜂窝网传输
                                      UIImagePickerControllerQualityType640x480:640*480
                                      UIImagePickerControllerQualityTypeIFrame1280x720:1280*720
                                      UIImagePickerControllerQualityTypeIFrame960x540:960*540

@property(nonatomic) BOOL showsCameraControls  //是否显示摄像头控制面板,默认为YES

@property(nonatomic,retain) UIView *cameraOverlayView  //摄像头上覆盖的视图,可用通过这个视频来自定义拍照或录像界面

@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode  //摄像头捕获模式,捕获模式是枚举类型:
                                              UIImagePickerControllerCameraCaptureModePhoto://拍照模式
                                              UIImagePickerControllerCameraCaptureModeVideo://视频录制模式

@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice    //摄像头设备,cameraDevice是枚举类型:
                                        UIImagePickerControllerCameraDeviceRear://前置摄像头
                                        UIImagePickerControllerCameraDeviceFront://后置摄像头

@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode    //闪光灯模式,枚举类型:
                                            UIImagePickerControllerCameraFlashModeOff://关闭闪光灯
                                            UIImagePickerControllerCameraFlashModeAuto://闪光灯自动
                                            UIImagePickerControllerCameraFlashModeOn://打开闪光灯

//方法:

+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType   //指定的源类型是否可用

+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice // 指定的摄像头是否可用

+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice  //指定摄像头的闪光灯是否可用

+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice  //获得指定摄像头上的可用捕获模式

void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo)  //保存照片到相簿

void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo)  //保存视频到相簿

BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) //能否将视频保存到相簿

//协议方法:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info // 媒体拾取完成

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker // 取消拾取

使用UIImagePickerController要签订两个协议

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

{
    int _isVideo; //是否录制视频,如果为1表示录制视频,0代表拍照
    AVPlayer *_player;//播放器,用于录制完视频后播放视频
}

@property (strong,nonatomic) UIImagePickerController *imagePicker;
@property (weak, nonatomic) IBOutlet UIImageView *photo;//照片展示视

@end

 

 

主要代码实现如下

- (void)viewDidLoad {
    [super viewDidLoad];
    //通过这里设置时拍照还是录制视频
    _isVideo=YES;
}
#pragma mark --懒加载(加载UIImagePickerController的时候才初始化属性)
-(UIImagePickerController *)imagePicker{
    if (!_imagePicker) {
        _imagePicker=[[UIImagePickerController alloc]init];
        _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头
        _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头
        if (_isVideo) {
            _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
            _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
            
        }else{
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
        }
        _imagePicker.allowsEditing=YES;//允许编辑
        _imagePicker.delegate=self;//设置代理,检测操作
    }
    return _imagePicker;
}

#pragma mark - UIImagePickerController代理方法(点击保存调用方法)
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照
        UIImage *image;
        //如果允许编辑则获得编辑后的照片,否则获取原始照片
        if (self.imagePicker.allowsEditing) {
            image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片
        }else{
            image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片
        }
        [self.photo setImage:image];//显示照片
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存到相簿
    }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频
        NSLog(@"video...");
        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径
        NSString *urlStr=[url path];
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
            //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存
            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿
        }
        
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark --点击取消调用方法
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
}

//视频保存后的回调
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error) {
        NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);
    }else{
        NSLog(@"视频保存成功.");
        //录制完之后自动播放
        NSURL *url=[NSURL fileURLWithPath:videoPath];
        _player=[AVPlayer playerWithURL:url];
        AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player];
        playerLayer.frame=self.photo.frame;
        [self.photo.layer addSublayer:playerLayer];
        [_player play];
        
    }   
}

#pragma mark - UI事件(点击拍照按钮)
- (IBAction)takeClick:(UIButton *)sender {
    [self presentViewController:self.imagePicker animated:YES completion:nil];
}

 

这里我设置了拾取源是摄像头,模式是视频录制,拍照的功能也是一样的写法,只需要将_isVideo初始化的时候设置为NO就行了