最近优化一些项目,然后就简单的把调用系统相机封装了一下。
1 首先需要申请权限
2 跳转到UIImagePickerController的代码
+(ImagePickerManager *)shareManager{
static ImagePickerManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[ImagePickerManager alloc] init];
});
return instance;
}
-(void)showImagePickFromController:(UIViewController *)vc sourceType:(UIImagePickerControllerSourceType)sourceType completion:(completionImageBlock)completion{
[self showImagePickFromAllowsEditing:NO videoQuality:UIImagePickerControllerQualityTypeLow sourceType:sourceType modalPresentationStyle:UIModalPresentationFullScreen controller:vc isFlash:YES completion:completion];
}
-(void)showImagePickFromController:(UIViewController *)vc isEditing:(BOOL)isEditing isFlash:(BOOL)isFlash completion:(completionImageBlock)completion{
[self showImagePickFromAllowsEditing:isEditing videoQuality:UIImagePickerControllerQualityTypeLow sourceType:UIImagePickerControllerSourceTypePhotoLibrary modalPresentationStyle:UIModalPresentationFullScreen controller:vc isFlash:isFlash completion:completion];
}
-(void)showImagePickFromController:(UIViewController *)vc completion:(completionImageBlock)completion{
[self showImagePickFromAllowsEditing:NO videoQuality:UIImagePickerControllerQualityTypeLow sourceType:UIImagePickerControllerSourceTypePhotoLibrary modalPresentationStyle:UIModalPresentationFullScreen controller:vc isFlash:YES completion:completion];
}
-(void)showImagePickFromAllowsEditing:(BOOL)allowsEditing videoQuality:(UIImagePickerControllerQualityType)videoQuality sourceType:(UIImagePickerControllerSourceType)sourceType modalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle controller:(UIViewController *)vc isFlash:(BOOL)isFlash completion:(completionImageBlock)completion{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
//可以编辑
picker.allowsEditing = allowsEditing;
//设置图片质量
picker.videoQuality=videoQuality;
picker.sourceType = sourceType;
picker.modalPresentationStyle = modalPresentationStyle;
picker.mediaTypes = @[(NSString *)kUTTypeImage,(NSString *)kUTTypeMovie];
if (isFlash&&sourceType==UIImagePickerControllerSourceTypeCamera) {
picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
}
_vc = vc;
_comBlock = [completion copy];
[_vc presentViewController:picker animated:YES completion:^{
}];
}
3 取消
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[_vc dismissViewControllerAnimated:YES completion:^{
}];
}
4 确定图片之后的回调
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//主线程等待0.5秒回到根视图
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(0.51 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (![_vc.presentedViewController isBeingDismissed]) {
[_vc dismissViewControllerAnimated:YES completion:^{
}];
}
});
NSString *mediaType = info[UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
UIImage *editedImage = info[UIImagePickerControllerEditedImage];
UIImage *originalImage = info[UIImagePickerControllerOriginalImage];
UIImage *needImage = nil;
if (originalImage) {
needImage = originalImage;
}
if (editedImage) {
needImage = editedImage;
}
if (_comBlock) {
_comBlock(needImage);
}
}else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){
NSURL *videoURL = info[UIImagePickerControllerMediaURL];
if (videoURL) {
if (_comBlock) {
_comBlock(videoURL);
}
}
}
}
5 使用
/*
UIImagePickerControllerSourceTypePhotoLibrary 总相册
UIImagePickerControllerSourceTypeCamera 摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum 时刻
*/
[[ImagePickerManager shareManager] showImagePickFromController:self completion:^(id imageOrMovie) {
if (imageOrMovie) {
[self showImage:imageOrMovie];
}
}];
Demo
点击打开链接