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
- UIImagePickerController的简单应用
- UIImagePickerController的简单使用
- UIImagePickerController 的简单实用
- 关于UIImagePickerController的简单使用
- UIImagePickerController简单使用
- UIImagePickerController简单使用
- 设置应用内的系统控件语言 如UIImagePickerController
- UIImagePickerController的基本知识
- UIImagePickerController的用法
- UIImagePickerController的简化使用
- UIImagePickerController崩溃的问题
- UIImagePickerController的使用
- UIImagePickerController的静态方法
- UIImagePickerController的详细使用
- UIImagePickerController的使用
- UIImagePickerController的基础用法
- UIImagePickerController的坑
- UIImagePickerController
- Autorelease自动释放池
- Android 热补丁动态修复框架小结
- JAVA内存模型
- eclipse属性配置(背景色字体等)文件的导入导出方法
- spark-shell出错_解决方法
- UIImagePickerController的简单应用
- 【JavaScript】对象结构的简化--删除Json中的空属性、空数组
- http://blog.csdn.net/cswhale/article/details/16941281
- 余数和商 一位数乘以一位数
- Android studio 编译项目时报错: Gradle 'XXX' project refresh failed
- Selenium - Drive Firefox
- 数据库分区表
- UVa 10160 - Servicing Stations
- android 录音与播放录音 带根据音频大小动态效果