最近研究了一下UIImagePickerController,发现以前的写的项目中用UIImagePickerController做的换头像的功能存在很多的不规范之处。so,重新整理一下,不为别的只为了让自己以后更规范,当然更方便啦。
功能:三个按钮分别为拍照、录制视频和访问相册
具体实现如下:
类必须遵守<UINavigationControllerDelegate,UIImagePickerControllerDelegate>协议,并实现代理方法;
代理方法如下:
#pragma mark - UIImagePickerController的代理方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
NSLog(@"info: %@:",info);
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//MobileCoreServices.frameWork中的kUTTypeImage,mediaType的默认值就是kUTTypeImage
//拍照
if ([mediaType isEqualToString:(NSString *)kUTTypeImage] && picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImage * theImage = nil;
if (picker.allowsEditing) {
theImage = [info objectForKey:UIImagePickerControllerEditedImage];
}else{
theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
}
UIImageWriteToSavedPhotosAlbum(theImage, self, @selector(image:didFinishSavingWithError: contextInfo:), nil);
}else if([mediaType isEqualToString:(NSString *)kUTTypeMovie] && picker.sourceType == UIImagePickerControllerSourceTypeCamera){
//获取拍摄视频url,并存入媒体库
NSURL *mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSString *urlStr = [mediaURL path];
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
//保存视频到相簿,注意也可以使用ALAssetsLibrary来保存
UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿
}
}else{
#warning 选择照片分支
}
[imagePickerController dismissViewControllerAnimated:YES completion:nil];
}
//点击cancel时回调函数
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[imagePickerController dismissViewControllerAnimated:YES completion:nil];
}
调用UIImagePickerController的三种方式实现:
/**
* 拍照
*
* @param sender 拍照按钮
*/
- (IBAction)takePhoto:(id)sender {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//拍照或者录制视频
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
//设置拍摄照片
imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
//选择使用前置摄像头,默认为后置
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
//设置拍摄的照片可以编辑
imagePickerController.allowsEditing = YES;
[self presentViewController:imagePickerController animated:YES completion:nil];
}else{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"相机不可用" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击了取消");
}];
[alertController addAction:cancleAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
/**
* 录制视频
*
* @param sender
*/
- (IBAction)takeVideo:(id)sender {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//拍照或者录制视频
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
// 将mediaTypes设为所有支持的多媒体类型
imagePickerController.mediaTypes = [UIImagePickerController
availableMediaTypesForSourceType:
UIImagePickerControllerSourceTypeCamera];
//设置拍摄照片
imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
//选择使用前置摄像头,默认为后置
imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
// 设置拍摄高质量的视频
imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
//设置拍摄的照片可以编辑
imagePickerController.allowsEditing = YES;
[self presentViewController:imagePickerController animated:YES completion:nil];
}else{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"相机不可用" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击了取消");
}];
[alertController addAction:cancleAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
/**
* 访问相册
*
* @param sender
*/
- (IBAction)loadPhotoes:(id)sender {
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePickerController.allowsEditing = YES;
[self presentViewController:imagePickerController animated: YES completion:nil];
}