「这是我参与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,先判断相机是否可用
初始化sourceType配置放到viewDidLoad会崩溃,因此自定义个init方法去实现
self.sourceType = UIImagePickerControllerSourceTypeCamera;
自定义相机拍照区域
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)); 方法
3.3 连续拍照按钮功能
连续拍照的话每一次需要把当前获取的照片保存到本地,以备后续使用。具体本地保存照片实现,笔者没有去写。
3.3 使用拍照按钮功能
使用照片按钮功能实现,如果是单张的,直接把获取到的图片传参过去即可实现,如果是连续拍照功能,需要获取本地保存图片的数组,自己去刷新页面。
3.4 切换摄像头、开启闪光灯
因为都是继承系统UIImagePickerController,可以直接使用系统的功能去实现
3.4 取消按钮功能
总结
自定义相机其实一般都是为了布局不同的UI,功能的实现都是对应的系统API功能。 有兴趣的可以看下Demo,实现的功能比较简单, Demo的链接