通过相册和相机去获取照片(公用类)
2019-03-20 本文已影响0人
追梦小怪兽
前言:
这个需求应该有很多人都会用到。因为这个在我的几个项目中都有用到。就花了点时间来写了一个公用的类。不过遇到了几个坑,下面给大家一一说明,话不多说,show you code。
- 首先:是公用类的头文件,第一个注意点如果你没有使用pch并且在pch中导入包含UIKit的类的话,一定要在这里导入UIKit,不然UI的类你是用不了的。通过一个block 在获取到图片之后回调到你使用的地方。
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef void (^ChoosePictureCompleteBlock)(UIImage *image);
@interface LTChoosePicture : NSObject
@property (nonatomic,copy) ChoosePictureCompleteBlock completeBlock;
- (void)LTChoosePictureFromAblumOrCameraWithController:(UIViewController *)viewController tipTitle:(NSString *)tipTitle completeBlock:(ChoosePictureCompleteBlock)block;
@end
NS_ASSUME_NONNULL_END
- 然后是实现文件
#import "LTChoosePicture.h"
@interface LTChoosePicture ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (nonatomic,strong) UIViewController *viewController;
@property (nonatomic,strong) UIImage *image;
@property (nonatomic,strong) NSString *titleString;
@end
@implementation LTChoosePicture
- (void)LTChoosePictureFromAblumOrCameraWithController:(UIViewController *)viewController tipTitle:(NSString *)tipTitle completeBlock:(ChoosePictureCompleteBlock)block{
self.viewController = viewController;
self.titleString = tipTitle;
self.completeBlock = block;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:tipTitle message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *abulmAction = [UIAlertAction actionWithTitle:@"相册照片" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self openAlbum];
}];
UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"拍摄照片" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self openCamera];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:abulmAction];
[alert addAction:cameraAction];
[alert addAction:cancelAction];
[viewController presentViewController:alert animated:YES completion:nil];
}
- (void)openAlbum{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self.viewController presentViewController:picker animated:YES completion:nil];
}
- (void)openCamera{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self.viewController presentViewController:picker animated:YES completion:nil];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
__weak typeof(self) weakSelf = self;
[picker dismissViewControllerAnimated:YES completion:^{
if (weakSelf.completeBlock){
weakSelf.completeBlock(image);
}
}];
}
- 最后调用
self.choosePic = [[LTChoosePicture alloc] init];
__weak typeof(self) weakSelf = self;
[self.choosePic LTChoosePictureFromAblumOrCameraWithController:self tipTitle:@"请选择照片来源" completeBlock:^(UIImage *image) {
NSLog(@"我来了");
weakSelf.imageView.image = image;
}];
-
当然我们必须在info.plist中加入权限Privacy - Camera Usage Description&&Privacy - Photo Library Usage Description。这个是必要的。
-
当你觉得大功告成的时候,结果会爆一个错误:errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}
百度一下就知道:Edit Scheme 中设置OS_ACTIVITY_MODE为disable即可解决
08AA5B62-17E6-42B2-B138-B8D85FC2294F.png -
OK。这些可以方便快捷的使用相册或相机加照片了。
---来自涛胖子的工作笔记