UIImagePickerController的简单应用

来源:互联网 发布:深入java虚拟机电子书 编辑:程序博客网 时间:2024/06/07 06:28
////  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

0 0
原创粉丝点击