UIImagePickerController的简单应用

//
//  ViewController.m
//  相机
//
//  Created by yeyuanxiang on 16/5/12.
//  Copyright © 2016年 KuYu_YX. All rights reserved.
//

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
//UIImagePickerController的代理需要遵守这两个协议.<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

@property (assign,nonatomic) int isVideo;//是否录制视频,如果为1表示录制视频,0代表拍照
@property (strong,nonatomic) UIImagePickerController *imagePicker;
@property (strong, nonatomic)  UIImageView *imageView;//照片展示视图
@property (strong,nonatomic) AVPlayer *player;//播放器,用于录制完视频后播放视频
@property (strong,nonatomic) UISegmentedControl *segment ;  //1表示录制视频,0代表拍照

@end


@implementation ViewController

-(UIImageView *)imageView
{
    if (_imageView == nil) {
        
        self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 290, self.view.bounds.size.width, self.view.bounds.size.height - 380)];
        self.imageView.backgroundColor = [UIColor clearColor];
        [self.view addSubview:_imageView];
    }
    
    return _imageView ;
}


#pragma mark - 控制器视图事件
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //UIImagePickerController静态方法判断设备是否支持照相机/图片库/相册功能
    /*
     typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
     UIImagePickerControllerSourceTypePhotoLibrary,           //照片库(通过同步存放的,用户不能删除)
     UIImagePickerControllerSourceTypeCamera,                //照相机
     UIImagePickerControllerSourceTypeSavedPhotosAlbum       //保存的照片(通过拍照或者截屏保存的,用户可以删除)
     };
     */
    
    
    [self initButton];
    
    
}


/*
 //UIImagePickerControllerMediaType 包含着KUTTypeImage 和KUTTypeMovie
 
 KUTTypeImage 包含:
 const CFStringRef  kUTTypeImage ;抽象的图片类型
 const CFStringRef  kUTTypeJPEG ;
 const CFStringRef  kUTTypeJPEG2000 ;
 const CFStringRef  kUTTypeTIFF ;
 const CFStringRef  kUTTypePICT ;
 const CFStringRef  kUTTypeGIF ;
 const CFStringRef  kUTTypePNG ;
 const CFStringRef  kUTTypeQuickTimeImage ;
 const CFStringRef  kUTTypeAppleICNS
 const CFStringRef kUTTypeBMP;
 const CFStringRef  kUTTypeICO;
 
 
 
 
 
 KUTTypeMovie 包含:
 const CFStringRef  kUTTypeAudiovisualContent ;抽象的声音视频
 const CFStringRef  kUTTypeMovie ;抽象的媒体格式(声音和视频)
 const CFStringRef  kUTTypeVideo ;只有视频没有声音
 const CFStringRef  kUTTypeAudio ;只有声音没有视频
 const CFStringRef  kUTTypeQuickTimeMovie ;
 const CFStringRef  kUTTypeMPEG ;
 const CFStringRef  kUTTypeMPEG4 ;
 const CFStringRef  kUTTypeMP3 ;
 const CFStringRef  kUTTypeMPEG4Audio ;
 const CFStringRef  kUTTypeAppleProtectedMPEG4Audio;
 
 
 */

#pragma mark - 私有方法
-(UIImagePickerController *)imagePicker{
    if (!_imagePicker) {
        _imagePicker=[[UIImagePickerController alloc]init];
        _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头
        _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头
        if (self.isVideo) {
            _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
            _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
            
        }else{
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
        }
        _imagePicker.allowsEditing=YES;//允许编辑
        _imagePicker.delegate=self;//设置代理,检测操作
    }
    return _imagePicker;
}



-(void)initButton
{
    self.isVideo = NO ;
    self.segment = [[UISegmentedControl alloc] initWithItems:@[@"拍照",@"录制"]];
    _segment.frame = CGRectMake(0, self.view.bounds.size.height - 40, self.view.bounds.size.width, 40) ;
    _segment.selectedSegmentIndex = 0 ;
    
    [_segment addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:_segment];
    
    __weak typeof(self) weakify = self ;
    void (^block)(UIButton *, NSString *, UIColor *) = ^(UIButton *button, NSString *string,UIColor *color){
        
        button.backgroundColor = color ;
        button.layer.cornerRadius = 7 ;
        [button setTitle:string forState:UIControlStateNormal];
        [weakify.view addSubview:button];
    };
    
    
    NSArray *array = @[@"图库",@"拍照",@"相册"];
    
    for (int i = 1; i < 4; i++) {
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        button.tag = i ;
        button.frame = CGRectMake(100, 50 + (i-1) * 20 + (i-1) * 60 , 175, 60) ;
        
        NSString *string = array[i-1] ;
        
        block(button,string,[UIColor redColor]);
        
    }
    
    
    UIButton *button1 = [self.view viewWithTag:1];
    UIButton *button2 = [self.view viewWithTag:2];
    UIButton *button3 = [self.view viewWithTag:3];
    
    
    [button1 addTarget:self action:@selector(takeClick1) forControlEvents:UIControlEventTouchUpInside];
    
    [button2 addTarget:self action:@selector(takeClick2) forControlEvents:UIControlEventTouchUpInside];
    
    [button3 addTarget:self action:@selector(takeClick3) forControlEvents:UIControlEventTouchUpInside];
}


#pragma mark --
-(void)segmentAction:(UISegmentedControl *)segment
{
    
    NSInteger index = segment.selectedSegmentIndex ;
    NSLog(@"%ld",index);
    switch (index) {
        case 0:{
            self.isVideo = NO ;
            UIButton *button1 = [self.view viewWithTag:1];
            UIButton *button2 = [self.view viewWithTag:2];
            UIButton *button3 = [self.view viewWithTag:3];
            
            button1.hidden = NO ;
            button2.hidden = NO ;
            button3.hidden = NO ;
            self.imageView.frame = CGRectMake(0, 290, self.view.bounds.size.width, self.view.bounds.size.height - 380);
        }
            break;
            
        case 1:{
            self.isVideo = YES ;
            
            UIButton *button1 = [self.view viewWithTag:1];
            UIButton *button2 = [self.view viewWithTag:2];
            UIButton *button3 = [self.view viewWithTag:3];
            
            button1.hidden = YES ;
            button2.hidden = YES ;
            button3.hidden = YES ;
            self.imageView.frame = CGRectMake(0, 0, self.view.bounds.size.width,self.view.bounds.size.height -40) ;
            _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
            _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
            _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
            [self presentViewController:self.imagePicker animated:YES completion:nil];
            
        }
            break;
        default:
            break;
    }
}


#pragma mark - UI事件
//点击拍照按钮
- (void)takeClick1 {
    
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
    {
        NSLog(@"支持图库");
        
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary ;
        picker.delegate = self ;
        picker.allowsEditing = YES ;
        [self presentViewController:picker animated:YES completion:nil];
    }
    else
    {
        NSLog(@"图库不可用");
    }
    
    
    
}

-(void)takeClick2{
    
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        NSLog(@"支持相机");
        self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera ;
        _imagePicker.mediaTypes=@[(NSString *)kUTTypeImage];
        _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto ;
        [self presentViewController:self.imagePicker animated:YES completion:nil];
        
    }
    else
    {
        NSLog(@"相机不可用");
    }
    
    
    
    
    
}

-(void)takeClick3{
    
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    {
        NSLog(@"支持相片库");
        
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum ;
        picker.delegate = self ;
        picker.allowsEditing = YES ;
        [self presentViewController:picker animated:YES completion:nil];
    }
    else
    {
        NSLog(@"相片库不可用");
    }
    
    
}




//字典中的键:
/*
 NSString *const  UIImagePickerControllerMediaType ;指定用户选择的媒体类型(文章最后进行扩展)
 NSString *const  UIImagePickerControllerOriginalImage ;原始图片
 NSString *const  UIImagePickerControllerEditedImage ;修改后的图片
 NSString *const  UIImagePickerControllerCropRect ;裁剪尺寸
 NSString *const  UIImagePickerControllerMediaURL ;媒体的URL
 NSString *const  UIImagePickerControllerReferenceURL ;原件的URL
 NSString *const  UIImagePickerControllerMediaMetadata;当来数据来源是照相机的时候这个值才有效
 */


#pragma mark - imagePicker代理方法

//当用户取消选取时调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    
    
    NSLog(@"取消");
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
    
}


//当用户选取完成后调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照
        
        NSLog(@"相机、图库、相册......模式");
        
        [self isPicker:picker MediaWithInfo:info];
        
        // 关闭照片选择器
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频
        
        NSLog(@"录制视屏模式");
        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径
        NSString *urlStr=[url path];
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
            //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存
            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿
        }
    }
    
    
    
    
    NSLog(@"完成");
    
    
    
}


//视频保存后的回调
- (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.imageView.frame;
        [self.imageView.layer addSublayer:playerLayer];
        [_player play];
        
    }
}


-(void)isPicker:(UIImagePickerController *)picker MediaWithInfo:(NSDictionary *)info
{
    
    UIImage *image = [self chooseSelectorPicker:picker MediaWithInfo:info];
    self.imageView.image = image ;
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
        
        // 需要将照片保存至应用程序沙箱,由于涉及到数据存储,同时与界面无关
        // 可以使用多线程来保存图像
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            // 保存图像
            // 1. 取图像路径
            NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *imagePath = [docs[0]stringByAppendingPathComponent:@"11.png"];
            NSLog(@"imagePath     =       %@",imagePath);
            // 2. 转换成NSData保存
            NSData *imageData = UIImagePNGRepresentation(image);
            [imageData writeToFile:imagePath atomically:YES];
        });
        
        
        //UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo) __TVOS_PROHIBITED;
        //将照片写进相册
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) ;
    }
    
    
}

//判断否编辑去图片
-(UIImage *)chooseSelectorPicker:(UIImagePickerController *)picker MediaWithInfo:(NSDictionary *)info
{
    UIImage *image;
    //如果允许编辑则获得编辑后的照片,否则获取原始照片
    if (picker.allowsEditing) {
        image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片
    }else{
        image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片
    }
    
    
    return image ;
}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值