自定义相机实现

831 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

前言

此文章仅提供继承UIImagePickerController的实现方式,因为仅仅就UI上些许改的,改动比较小,依照系统API为主。

系统提供的相机页面及功能不是我想要的,因此需要对相机的页面及按钮进行自定义,这里简单说一下实现思路。

1. 系统API简述

闪光灯

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
    UIImagePickerControllerCameraFlashModeOff  = -1,
    UIImagePickerControllerCameraFlashModeAuto = 0,
    UIImagePickerControllerCameraFlashModeOn   = 1
} API_UNAVAILABLE(tvos);

摄像头前置和后置

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
    UIImagePickerControllerCameraDeviceRear,
    UIImagePickerControllerCameraDeviceFront
} API_UNAVAILABLE(tvos);

摄像模式,拍照是视频还是图片

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
    UIImagePickerControllerCameraCaptureModePhoto,
    UIImagePickerControllerCameraCaptureModeVideo
} API_UNAVAILABLE(tvos);

拍照按钮调用

- (void)takePicture API_AVAILABLE(ios(3.1));
/// 调用此方法后会调用UIImagePickerController的代理方法,可以获取到当前拍照照片
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info;

额外具体的API用到的自己查看就行,毕竟全粘贴的话有水字数的嫌疑。。。

2. 自定义cameraOverlayView

初始化相机配置

GBYCameraPickerController继承自UIImagePickerController,先判断相机是否可用

image.png

初始化sourceType配置放到viewDidLoad会崩溃,因此自定义个init方法去实现

self.sourceType = UIImagePickerControllerSourceTypeCamera;

image.png

自定义相机拍照区域

image.png

3. 自定义按钮实现

3.1 视图布局

笔者项目自定义区域比较简单,因此只是把视图分为三个部分,头部topContainerView,中间拍照区域为UIImageView以及底部的bottomContainerView(

/// 实现个闪光灯功能以及自定义头部标题
[self addSubview:self.topContainerView];
/// 相机UIImage
[self addSubview:self.cameraOverlayView];
/// 包含取消按钮、拍照按钮(继续拍照)、切换前后摄像头(使用照片按钮))
[self addSubview:self.bottomContainView];

实现此模式是为了实现连续拍照的功能,系统相机只能单张拍照,无法连续拍照。自定义的实现是,拍照之后会出现 连续拍照按钮,可以继续拍照也可以使用照片。

3.2 拍照按钮功能

拍照直接调用系统的 - (void)takePicture API_AVAILABLE(ios(3.1)); 方法

image.png

3.3 连续拍照按钮功能

连续拍照的话每一次需要把当前获取的照片保存到本地,以备后续使用。具体本地保存照片实现,笔者没有去写。

image.png

3.3 使用拍照按钮功能

使用照片按钮功能实现,如果是单张的,直接把获取到的图片传参过去即可实现,如果是连续拍照功能,需要获取本地保存图片的数组,自己去刷新页面。

image.png

3.4 切换摄像头、开启闪光灯

因为都是继承系统UIImagePickerController,可以直接使用系统的功能去实现

image.png

3.4 取消按钮功能

image.png

总结

自定义相机其实一般都是为了布局不同的UI,功能的实现都是对应的系统API功能。 有兴趣的可以看下Demo,实现的功能比较简单, Demo的链接