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;
picker.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;
picker.mediaTypes = @[(NSString *)kUTTypeImage,(NSString *)kUTTypeMovie];
/**UIImagePickerControllerQualityType
UIImagePickerControllerQualityTypeHigh 高清
UIImagePickerControllerQualityTypeMedium 中等
UIImagePickerControllerQualityTypeLow 低等
UIImagePickerControllerQualityType640x480
*/
picker.videoQuality = UIImagePickerControllerQualityTypeHigh;
/**UIImagePickerControllerCameraCaptureMode
UIImagePickerControllerCameraCaptureModePhoto,
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. 其他设置的属性
@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,
id 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);
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];
NSURL* url = [info objectForKey:UIImagePickerControllerMediaURL];
NSDictionary* metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
UIImageWriteToSavedPhotosAlbum(image, self,@selector(image:didFinishSavingWithError:contextInfo:), nil);
} else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
NSURL *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(@"保存视频完成");
}
仅供参考,错误勿怪!