UIImagePickerController 相册/相机/相簿
1. info.plist 设置
Privacy - Photo Library Usage Description 是否允许设备调用您的相册?Privacy - Camera Usage Description 是否允许设备调用您的相机?2. UIImagePickerControllerSourceType 控制器类型
UIImagePickerControllerSourceTypePhotoLibrary 相册UIImagePickerControllerSourceTypeSavedPhotosAlbum 相簿UIImagePickerControllerSourceTypeCamera 相机3. 初始化
// 判断是否可以打开相册/相机/相簿if (![UIImagePickerController isSourceTypeAvailable:sourceType]) return;UIImagePickerController *picker = [[UIImagePickerController alloc] init];picker.sourceType = sourceType; // 设置控制器类型// UIImagePickerController继承UINavigationController实现UINavigationDelegate和UIImagePickerControllerDelegatepicker.delegate = self; // 设置代理
4. allowsEditing 是否允许编辑(查看详图)
picker.allowsEditing = YES;
5. 判断
#pragma mark ~~~~~~~~~~ 摄像头和相册相关的公共类 ~~~~~~~~~~// 判断设备是否有摄像头- (BOOL) isCameraAvailable{return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];}// 前面的摄像头是否可用- (BOOL) isFrontCameraAvailable{return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];}// 后面的摄像头是否可用- (BOOL) isRearCameraAvailable{return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];}// 判断是否支持某种多媒体类型:拍照,视频- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{__block BOOL result = NO;if ([paramMediaType length] == 0){NSLog(@"Media type is empty.");return NO;}NSArray *availableMediaTypes =[UIImagePickerController availableMediaTypesForSourceType:paramSourceType];[availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {NSString *mediaType = (NSString *)obj;if ([mediaType isEqualToString:paramMediaType]){result = YES;*stop= YES;} }];return result;}// 检查摄像头是否支持录像- (BOOL) doesCameraSupportShootingVideos{return [self cameraSupportsMedia:(NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypeCamera];}// 检查摄像头是否支持拍照- (BOOL) doesCameraSupportTakingPhotos{return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera];}#pragma mark ~~~~~~~~~~ 相册文件选取相关 ~~~~~~~~~~// 相册是否可用- (BOOL) isPhotoLibraryAvailable{return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];}// 是否可以在相册中选择视频- (BOOL) canUserPickVideosFromPhotoLibrary{return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];}// 是否可以在相册中选择视频- (BOOL) canUserPickPhotosFromPhotoLibrary{return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];}
6. 相机的详细设置
// 如果是相机if (sourceType == UIImagePickerControllerSourceTypeCamera) {// 录像的最大时间picker.videoMaximumDuration = 10;// 相机的类型 (需要导入<MobileCoreServices/MobileCoreServices.h>)(video是无声音,movie是有声音)picker.mediaTypes = @[(NSString *)kUTTypeImage,(NSString *)kUTTypeMovie];// 视频质量/**UIImagePickerControllerQualityTypeUIImagePickerControllerQualityTypeHigh 高清UIImagePickerControllerQualityTypeMedium 中等UIImagePickerControllerQualityTypeLow 低等UIImagePickerControllerQualityType640x480*/picker.videoQuality = UIImagePickerControllerQualityTypeHigh;// 设置摄像头模式/**UIImagePickerControllerCameraCaptureModeUIImagePickerControllerCameraCaptureModePhoto,UIImagePickerControllerCameraCaptureModeVideo*/picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;/**UIImagePickerControllerCameraDevice 设置前后射像头\UIImagePickerControllerCameraDeviceRear 后UIImagePickerControllerCameraDeviceFront 前*/picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;/**UIImagePickerControllerCameraFlashMode 闪光模式UIImagePickerControllerCameraFlashModeOff 关闭UIImagePickerControllerCameraFlashModeAuto 自动UIImagePickerControllerCameraFlashModeOn 开启*/picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;/**UIImagePickerControllerImageURLExportPreset 图片地址出口预设UIImagePickerControllerImageURLExportPresetCompatible 兼容UIImagePickerControllerImageURLExportPresetCurrent 当前*/(IOS 11 后使用)picker.imageExportPreset = UIImagePickerControllerImageURLExportPresetCompatible;picker.videoExportPreset = UIImagePickerControllerImageURLExportPresetCompatible;}
7. 跳转到控制器
[self presentViewController:picker animated:YES completion:nil];
8. 其他设置的属性
/* 是否显示摄像头控制面板,默认为YES */@property (nonatomic) BOOL showsCameraControls;/* 摄像头上覆盖的视图 */@property (nonatomic,strong) UIView *cameraOverlayView;/* 摄像头形变 */@property (nonatomic) CGAffineTransform cameraViewTransform;
9. 对象调用的方法
-(void)takePicture; //拍照 -(BOOL)startVideoCapture;//开始录制视频-(void)stopVideoCapture;//停止录制视频10. 保存图片或录像
/* 保存图片到相簿 */void UIImageWriteToSavedPhotosAlbum(UIImage *image,//保存的图片UIImageid completionTarget,//回调的执行者SEL completionSelector, //回调方法void *contextInfo//回调参数信息);//上面一般保存图片的回调方法为:- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;/* 判断是否能保存视频到相簿 */BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath);/* 保存视频到相簿 */void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, //保存的视频文件路径id completionTarget, //回调的执行者SEL completionSelector,//回调方法void *contextInfo//回调参数信息);
11. UIImagePickerControllerDelegate代理方法
// 获取图片后操作- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {NSLog(@"%@",info);//从info取出此时摄像头的媒体类型NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照//获取拍照的图像UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];//获取照片的原图 UIImage* original = [info objectForKey:UIImagePickerControllerOriginalImage]; //获取图片裁剪的图 UIImage* edit = [info objectForKey:UIImagePickerControllerEditedImage]; //获取图片裁剪后,剩下的图 UIImage* crop = [info objectForKey:UIImagePickerControllerCropRect]; //获取图片的url NSURL* url = [info objectForKey:UIImagePickerControllerMediaURL]; //获取图片的metadata数据信息 NSDictionary* metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];//保存图像到相簿UIImageWriteToSavedPhotosAlbum(image, self,@selector(image:didFinishSavingWithError:contextInfo:), nil);} else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {//如果是录像//获取录像文件路径URLNSURL *url = [info objectForKey:UIImagePickerControllerMediaURL];NSString *path = url.path;//判断能不能保存到相簿if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path)) {//保存视频到相簿UISaveVideoAtPathToSavedPhotosAlbum(path, self,@selector(video:didFinishSavingWithError:contextInfo:), nil);}}// 异步保存视频方法 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);}});// 销毁控制器[picker dismissViewControllerAnimated:YES completion:nil];}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {[picker dismissViewControllerAnimated:YES completion:nil];NSLog(@"我点击了关闭");}// 上面保存图片或录像的方法- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {NSLog(@"保存图片完成");}- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {NSLog(@"保存视频完成");}