首先需要支持iOS 8.0及其以上的版本
UIAlertController 有两种展示方式
1 就是列表类型的
UIAlertControllerStyleActionSheet
2 就是弹出框类型的
UIAlertControllerStyleAlert
代码
.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef enum : NSUInteger {
selectImageType,
selectMovieType,
selectImageAndMovieType,
} SelectImageMovieType;
typedef void(^completionImageBlock)(id imageOrMovie);
@interface ImagePickerManager : NSObject<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
+(ImagePickerManager *)shareManager;
-(void)showImagePickFromController:(UIViewController *)vc
sourceType:(UIImagePickerControllerSourceType)sourceType
imageMovieSelectedType:(SelectImageMovieType)imageMovieSelectedType
completion:(completionImageBlock)completion;
-(void)showImagePickFromController:(UIViewController *)vc
isEditing:(BOOL)isEditing
isFlash:(BOOL)isFlash
completion:(completionImageBlock)completion;
-(void)showImagePickFromController:(UIViewController *)vc
completion:(completionImageBlock)completion;
-(void)showImagePickFromAllowsEditing:(BOOL)allowsEditing
videoQuality:(UIImagePickerControllerQualityType)videoQuality
sourceType:(UIImagePickerControllerSourceType)sourceType
modalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle
controller:(UIViewController *)vc
isFlash:(BOOL)isFlash
imageMovieSelectedType:(SelectImageMovieType)imageMovieSelectedType
completion:(completionImageBlock)completion;
@end
.m
#import "ImagePickerManager.h"
#import <MobileCoreServices/MobileCoreServices.h>
@implementation ImagePickerManager
{
UIViewController *_vc;
completionImageBlock _comBlock;
}
+(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
imageMovieSelectedType:(SelectImageMovieType)imageMovieSelectedType
completion:(completionImageBlock)completion{
[self showImagePickFromAllowsEditing:NO
videoQuality:UIImagePickerControllerQualityTypeLow
sourceType:sourceType
modalPresentationStyle:UIModalPresentationFullScreen
controller:vc
isFlash:YES
imageMovieSelectedType:imageMovieSelectedType
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
imageMovieSelectedType:selectImageType
completion:completion];
}
-(void)showImagePickFromController:(UIViewController *)vc
completion:(completionImageBlock)completion{
[self showImagePickFromAllowsEditing:NO
videoQuality:UIImagePickerControllerQualityTypeLow sourceType:UIImagePickerControllerSourceTypePhotoLibrary modalPresentationStyle:UIModalPresentationFullScreen
controller:vc
isFlash:YES
imageMovieSelectedType:selectImageType
completion:completion];
}
-(void)showImagePickFromAllowsEditing:(BOOL)allowsEditing
videoQuality:(UIImagePickerControllerQualityType)videoQuality
sourceType:(UIImagePickerControllerSourceType)sourceType
modalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle
controller:(UIViewController *)vc
isFlash:(BOOL)isFlash
imageMovieSelectedType:(SelectImageMovieType)imageMovieSelectedType
completion:(completionImageBlock)completion{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
//可以编辑
picker.allowsEditing = allowsEditing;
//设置图片质量
picker.videoQuality=videoQuality;
picker.sourceType = sourceType;
picker.modalPresentationStyle = modalPresentationStyle;
NSArray *mediaTypes = nil;
switch (imageMovieSelectedType) {
case selectImageType:
{
mediaTypes = @[(NSString *)kUTTypeImage];
}
break;
case selectMovieType:
{
mediaTypes = @[(NSString *)kUTTypeMovie];
}
break;
case selectImageAndMovieType:
{
mediaTypes = @[(NSString *)kUTTypeImage,(NSString *)kUTTypeMovie];
}
break;
default:
break;
}
picker.mediaTypes = mediaTypes;
if (isFlash&&sourceType==UIImagePickerControllerSourceTypeCamera) {
picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
}
_vc = vc;
_comBlock = [completion copy];
[_vc presentViewController:picker animated:YES completion:^{
}];
}
//点击Cancel按钮后执行方法
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[_vc dismissViewControllerAnimated:YES completion:^{
}];
}
-(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);
}
}
}
}
@end