OC记录3--UIImagePickerController

UIImagePickerController一个获取图片和视频的类,简单特点:

1,可获取相册,图库的图片;
2,可进行拍照,视频录制;
3,可对图片进行编辑;
4,可保存图片和视频到手机;
5,由下面方法推出:

1
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion; 

6,只支持竖屏模式;

UIImagePickerController.h文件查看

UIImagePickerController 父类继承关系
UIImagePickerController -> UINavigationController -> UIViewController -> UIResponder -> NSObject

类方法

1,当前UIImagePickerControllerSourceType类型是否可用;

1
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;

UIImagePickerControllerSourceType是一个枚举类型,表示打开类型:

1
2
3
4
5
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,//图库,所有图片
UIImagePickerControllerSourceTypeCamera,//相机
UIImagePickerControllerSourceTypeSavedPhotosAlbum//相册
}

2,返回一个当前相机支持类型,拍照,视频,拍照和视频等三种方式;

1
+ (nullable NSArray<NSString *> *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType;

3,判断当前手机摄像头是否可用;

1
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice;

UIImagePickerControllerCameraDevice是一个枚举类型,表示的是摄像头的方向;

1
2
3
4
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
UIImagePickerControllerCameraDeviceRear,//后置摄像头
UIImagePickerControllerCameraDeviceFront//前置摄像头
}

4,判断手机前置摄像头或者后置摄像头是否支持闪光灯和手电筒;

1
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice;

5,判断手机不同摄像头支持的拍摄类型,有图片和视频;

1
+ (nullable NSArray<NSNumber *> *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice

UIImagePickerControllerCameraDevice一个枚举,表示摄像头支持拍摄类型;

1
2
3
4
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
UIImagePickerControllerCameraCaptureModePhoto,//照片
UIImagePickerControllerCameraCaptureModeVideo//视频
}

属性

1,UIImagePickerController协议,包含本身UIImagePickerControllerDelegate和父类中的UINavigationControllerDelegate;

1
@property(nullable,nonatomic,weak)id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

UIImagePickerControllerDelegate协议方法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@optional//该修饰词修饰的方法不要求强制实现
//需要在如下可用方法中关闭相册等界面,调用方法:
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion;
//该方法已经被废弃
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
//获取到的图片或者视频的信息的回调
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;
info中的key值
NSString *const UIImagePickerControllerMediaType //用户指定的媒体类型:public.image或者是public.movie
NSString *const UIImagePickerControllerOriginalImage //原始图片
NSString *const UIImagePickerControllerEditedImage //编辑后的图片
NSString *const UIImagePickerControllerCropRect //裁剪尺寸
NSString *const UIImagePickerControllerMediaURL // 媒体的url
NSString *const UIImagePickerControllerReferenceURL // NS_DEPRECATED_IOS(4_1, 11_0, "Replace with public API: UIImagePickerControllerPHAsset") 原件的url
UIImagePickerControllerMediaMetadata // 图片的元数据
NSString *const UIImagePickerControllerLivePhoto //iOS9.1之后 所选或拍摄的照片的实时照片表示
NSString *const UIImagePickerControllerPHAsset // iOS11.0之后 原件的url
NSString *const UIImagePickerControllerImageURL //iOS11.0之后 包含图像文件的URL
//取消
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

2,设置打开类型,UIImagePickerControllerSourceType,包含:图库,照相机,相册;默认是:UIImagePickerControllerSourceTypePhotoLibrary,图库

1
@property(nonatomic)UIImagePickerControllerSourceType  sourceType;

3,在打开照相机下该值才有效,3中情况:只有拍照,只有视频,视频和拍照;

1
2
//@[@"public.image",@"public.movie"]
@property(nonatomic,copy) NSArray<NSString *> *mediaTypes;//kUTTypeImage

4,获取到的图片(视频无效)是否可以编辑,默认为NO:

1
2
3
4
//
@property(nonatomic)BOOL allowsEditing NS_AVAILABLE_IOS(3_1);
//废弃
@property(nonatomic)BOOL allowsImageEditing NS_DEPRECATED_IOS(2_0, 3_1);

5,获取到图片转换的类型,枚举类型;

1
2
//iOS11 的一个新属性,默认Current
@property(nonatomic)UIImagePickerControllerImageURLExportPreset imageExportPreset NS_AVAILABLE_IOS(11_0);

UIImagePickerControllerImageURLExportPreset

1
2
3
4
typedef NS_ENUM(NSInteger, UIImagePickerControllerImageURLExportPreset) {
UIImagePickerControllerImageURLExportPresetCompatible = 0,//jpeg
UIImagePickerControllerImageURLExportPresetCurrent//data
}

6,视频模式下才有效,最大录制时间,默认10分钟;

1
@property(nonatomic)NSTimeInterval   videoMaximumDuration;

7,视频下有效,录制视频的质量,枚举类型;

1
@property(nonatomic)UIImagePickerControllerQualityType  videoQuality NS_AVAILABLE_IOS(3_1);

UIImagePickerControllerQualityType

1
2
3
4
5
6
7
8
typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) {
UIImagePickerControllerQualityTypeHigh = 0, // 高质量
UIImagePickerControllerQualityTypeMedium = 1, // 适合WiFi下的质量
UIImagePickerControllerQualityTypeLow = 2, //低质量
UIImagePickerControllerQualityType640x480 NS_ENUM_AVAILABLE_IOS(4_0) = 3, // VGA 640x480
UIImagePickerControllerQualityTypeIFrame1280x720 NS_ENUM_AVAILABLE_IOS(5_0) = 4,//1280x720
UIImagePickerControllerQualityTypeIFrame960x540 NS_ENUM_AVAILABLE_IOS(5_0) = 5,//960x540
} __TVOS_PROHIBITED;

8,视频压缩质量,当为nil时,默认使用第七点中videoQuality的值;

1
2
//AVAssetExportPreset* string,该属性在iOS 11后生效
@property(nonatomic, copy)NSString *videoExportPreset NS_AVAILABLE_IOS(11_0);

自定义相机UI,属性,方法

在UIImagePickerControllerSourceTypeCamera下有效;

1,是否隐藏系统相机自带的的UI,默认是YES;设置为NO时,隐藏系统相机UI;

1
@property(nonatomic)BOOL  showsCameraControls

2,设置一个覆盖相机的view; preview对应的图层表示的是相机所在的view层;

1
@property(nullable, nonatomic,strong) __kindof UIView *cameraOverlayView  NS_AVAILABLE_IOS(3_1);   // set a view to overlay the preview view.

3,设置preview的CGAffineTransform, CGAffineTransform是一个用于处理形变的类,其可以改变控件的平移、缩放、旋转等,其坐标系统采用的是二维坐标系,即向右为x轴正方向,向下为y轴正方向;

1
@property(nonatomic)CGAffineTransform cameraViewTransform NS_AVAILABLE_IOS(3_1);   // set the transform of the preview view.

4,拍照;

1
- (void)takePicture;

5,开始录像,停止录像;

1
2
- (BOOL)startVideoCapture;
- (void)stopVideoCapture;

6,摄像头支持类型,默认是照片:UIImagePickerControllerCameraCaptureModePhoto;

1
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode NS_AVAILABLE_IOS(4_0);

7,摄像头方向,默认使用后置摄像头:UIImagePickerControllerCameraDeviceRear;

1
@property(nonatomic) UIImagePickerControllerCameraDevice    cameraDevice      NS_AVAILABLE_IOS(4_0);

8,摄像头闪光灯模式,默认自动:UIImagePickerControllerCameraFlashModeAuto;

1
@property(nonatomic) UIImagePickerControllerCameraFlashMode  cameraFlashMode   NS_AVAILABLE_IOS(4_0);

扩展函数:保存照片和视频到图库

保存图片到图库
1
2
3
4
5
6
7
8
9
10
11
UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo)
//调用
UIImageWriteToSavedPhotosAlbum(self.selectImageView.image, self, @selector(image: didFinishSavingWithError: contextInfo:), nil);
//保存状态
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error == nil) {
NSLog(@"保存相册成功");
}else{
NSLog(@"保存失败");
}
}
判断当前路径下的视频是否可以保存到相册;
1
UIKIT_EXTERN BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath)
保存视频到图库
1
2
3
4
5
6
7
8
9
10
11
UIKIT_EXTERN void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo)
//调用, videoPath视频路径
UISaveVideoAtPathToSavedPhotosAlbum([info[UIImagePickerControllerMediaURL] path], self, @selector(video: didFinishSavingWithError: contextInfo:), nil);
//保存状态
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error == nil) {
NSLog(@"保存视频成功");
}else{
NSLog(@"视频保存失败");
}
}