上一篇文章写了如何使用UIImagePickerController来调用相机,即使该类有一个CameraOverLayView可以自定义控制按钮,但是整体来说可定制性太差,因此我们来使用AVFoundation框架里的一些类实现完全自定义UI的相机。
我们先来看一下整个结构:
第一次看可能感觉到这么多类有点蒙。
下面介绍一下用到的类:
1.AVCaptureDevice:
表示硬件采集设备(摄像头、麦克风)以及与该设备关联的属性。
可以使用硬件采集设备配置底层硬件的属性。可以使用AVCaptureDevice类的方法来列出可用的设备。在设置硬件采集设备的属性(其焦点模式、曝光模式等)之前,必须首先使用lockForConfiguration:方法获取设备上的锁。同时还应该查询设备的功能,以确保打算设置的新模式对该设备有效。然后可以使用unlockforconfiguration方法设置属性并释放锁。
AVFoundation框架提供了两个主要的生成AVCaptureDevice对象的方式:
a.直接返回AVCaptureDevice对象:
AVCaptureDevice类的 defaultDeviceWithDeviceType:mediaType:position: 方法
[AVCaptureDevice defaultDeviceWithDeviceType:<#(nonnull AVCaptureDeviceType)#>
mediaType:<#(nullable AVMediaType)#> position:<#(AVCaptureDevicePosition)#>]
b.返回设备支持的AVCaptureDevice数组:
1.AVCaptureDeviceDiscoverySession (iOS10之后启用)类的方法
+ (instancetype)discoverySessionWithDeviceTypes:(NSArray<AVCaptureDeviceType> *)deviceTypes
mediaType:(nullable AVMediaType)mediaType
position:(AVCaptureDevicePosition)position;
NSArray* devices = [AVCaptureDeviceDiscoverySession
discoverySessionWithDeviceTypes:<#(nonnull NSArray<AVCaptureDeviceType> *)#>
mediaType:<#(nullable AVMediaType)#>
position:<#(AVCaptureDevicePosition)#>].devices];