如何封装调取系统相机与相册

当我们在开发一款app时,经常会获取相机或者系统相册来上传头像,或者上传证件照等单张图片获取的需求,为了避免过多的代码堆积在控制器中,并且可以方便使用,这样的调取方法可以直接封装成工具,通过代理方式传给控制器,这样方便管理和阅读代码,下边是我对于调取相机和相册进行的封装
1.创建一个NSObject, 以下是我创建的DtUploadPhoto
在DtUploadPhoto.h文件中定义属性和代理方法,方便传值

#import <Foundation/Foundation.h>
//如果你获取不到UIImage和UIViewController,请添加下边这个头文件
//#import <UIKit/UIKit.h>
@protocol DtUploadPhotoDelegate <NSObject>

@optional
- (void)uploadImageToServerWithImage:(UIImage *)image;
@end
@interface DtUploadPhoto : NSObject 

@property (nonatomic, weak) id<DtUploadPhotoDelegate> uploadImageDelegate;
//单例方法
+ (DtUploadPhoto *)shareUploadImage;
//弹出选项的方法
- (void)showActionSheetInFatherViewController:(UIViewController *)fatherVC delegate:(id<DtUploadPhotoDelegate>)delegate;

@end

在DtUploadPhoto.m中实现调取系统相机和相册的方法

#import "DtUploadPhoto.h"

@interface DtUploadPhoto () <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (nonatomic, weak) UIViewController *fatherViewController;
@end
static DtUploadPhoto *dtUploadImage = nil;

@implementation DtUploadPhoto
/* 设置单例,只初始化一次DtUploadPhoto实例 */
+ (DtUploadPhoto *)shareUploadImage {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dtUploadImage = [[DtUploadPhoto alloc] init];
    });
    return dtUploadImage;
}

- (void)showActionSheetInFatherViewController:(UIViewController *)fatherVC delegate:(id<DtUploadPhotoDelegate>)delegate {
    dtUploadImage.uploadImageDelegate = delegate;
    _fatherViewController = fatherVC;
    UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    
    UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self snapImage];
    }];
    
    UIAlertAction *action3 = [UIAlertAction actionWithTitle:@"从手机相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self localPhoto];
    }];
    
    [actionSheet addAction:action1];
    [actionSheet addAction:action2];
    [actionSheet addAction:action3];
    
    [fatherVC presentViewController:actionSheet animated:YES completion:nil];
}

- (void)snapImage {
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        __block UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
        ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
        ipc.delegate = self;
        ipc.allowsEditing = YES;
        ipc.navigationBar.barTintColor = [UIColor whiteColor];
        ipc.navigationBar.tintColor = [UIColor whiteColor];
        ipc.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor]};
        [_fatherViewController presentViewController:ipc animated:YES completion:^{
            ipc = nil;
        }];
    } else {
        NSLog(@"模拟器无法打开照相机");
    }
}
- (void)localPhoto {
    __block UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    picker.delegate = self;
    //设置选择后的图片可被编辑
    picker.allowsEditing = YES;
    picker.navigationBar.barTintColor = [UIColor whiteColor];
    picker.navigationBar.tintColor = [UIColor blackColor];
    picker.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor blackColor]};
    [_fatherViewController presentViewController:picker animated:YES completion:^{
        picker = nil;
    }];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    [picker dismissViewControllerAnimated:YES completion:^{
        UIImage *selectedImage = info[UIImagePickerControllerOriginalImage];
        /* 调取delegate方法,传递图片data到控制器使用 */
        if (self.uploadImageDelegate && [self.uploadImageDelegate respondsToSelector:@selector(uploadImageToServerWithImage:)]) {
            [self.uploadImageDelegate uploadImageToServerWithImage:selectedImage];
        }
    }];
}

@end

这样就封装好了调取相机和相册的代理方法,接下来就是在控制器中实现代理,在控制器中获取图片,并根据需要对图片进行压缩等操作

#import "DtUploadPhoto.h"
 <DtUploadPhotoDelegate>
 ...
//需要启动代理的地方启动代理方法
- (void)clickAction {
 //单张上传图片
 [[DtUploadPhoto shareUploadImage] showActionSheetInFatherViewController:self delegate:self];
 }
 
 #pragma mark -- 单张上传图片的delegate
 - (void)uploadImageToServerWithImage:(UIImage *)image {
 NSLog(@"%@",image);
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,318评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,856评论 25 709
  • 让自己放松,去感受身体。 开始想哭,让自己想哭,然后就哭了出来。 看到“我不值得”“我不好”“我怕做不好”一直在主...
    绽放绽放阅读 1,553评论 0 0
  • 昨天下午的时候,腹部就开始隐隐作痛; 想着应该是接连下了两天的雨突然降温有点着凉的缘故,毕竟已经入秋许久了。...
    灰头土脸的小王子阅读 1,631评论 0 1
  • 长安街,长安长,长安街长。 梨花飘,梨花落,梨花飘落。 长安街上风景依旧离人遥叹, 梨花飘落斑白依旧故人遥叹。 街...
    莘九阅读 1,261评论 0 0