直插正题!
首先导入一个头文件
|
|
由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件
|
|
导入头文件后我们需要创建几个相机必须的属性
|
|
AVCaptureSession控制输入和输出设备之间的数据传递
AVCaptureDeviceInput调用所有的输入硬件。例如摄像头和麦克风
AVCaptureStillImageOutput用于输出图像
AVCaptureVideoPreviewLayer镜头捕捉到得预览图层
一个session可以管理多个输入输出设备,如下图所示
接下来初始化所有对象,下面这个方法的调用我放到viewDidLoad里面调用了
|
|
之后在viewWillAppear,viewDidDisappear方法里开启和关闭session
|
|
到这里所有的初始化工作基本完成,运行程序可以看到镜头捕捉到得画面。接下来实现拍照按钮。
输出图像的时候需要用到AVCaptureConnection这个类,session通过AVCaptureConnection连接AVCaptureStillImageOutput进行图片输出,输入输出与connection的关系如下图
接下来搞一个获取设备方向的方法,再配置图片输出的时候需要使用
|
|
下面是拍照按钮方法
|
|
至此相机的拍照功能已经完成
注:
- [stillImageConnection setVideoScaleAndCropFactor:1];这个方法是控制焦距用的暂时先固定为1,后边写手势缩放焦距的时候会修改这里
- 照片写入相册之前需要进行旋转(我在代码里并没有进行旋转)
- 写入相册之前需要判断用户是否允许了程序访问相册,否则程序会崩溃,包括在开启相机的时候和拍摄按钮点击的时候都需要做安全验证,验证设别是否支持拍照,用户是否允许程序访问相机。
接下来完成闪光灯
|
|
闪光灯的设置非常简单,只需要修改device的flashMode属性即可,这里需要注意的是,修改device时候需要先锁住,修改完成后再解锁,否则会崩溃,设置闪光灯的时候也需要做安全判断,验证设备是否支持闪光灯,有些iOS设备是没有闪光灯的,如果不做判断还是会crash掉 T_T
剩下一个小功能就是切回镜头了,方法如下
|
|
isUsingFrontFacingCamera这个属性是个BOOL值变量,前面忘记写这个属性了。用于防止重复切换统一摄像头,调用这个点击方法的控件是个segement,文章最后我会附上demo地址。
最后一步就是加入手势缩放,手动调节相机焦距。
加入两个属性,并遵守这个协议
|
|
这两个属性分别用于记录缩放的比例。相机支持的焦距是1.0~67.5,所以再控制器加载的时候分别给这两个属性附上一个初值 1.0。之后给view添加一个缩放手势,手势调用的方法如下
|
|
这样之再实现一个delegate
|
|
在每次手势开始的时候把上一次实际缩放值赋给初始缩放值,如果不这么做的话你会发现每次手势开始的时候界面都会跳来跳去的(非常性感)。一个简单功能的相机基本上完成了,最后一步就是之前我们在拍照的方法里写死了一个1.0,我们还需要修改一下它,,否则虽然你看到的界面焦距改变了,但是实际拍出来的照片是没有变化的。找到拍照方法里的
|
|
修改为
|
|
至此大功告成。
文章演示demo下载
(https://github.com/RockyAo/RACustomCamera)
苹果官方演示demo下载
(https://github.com/RockyAo/CameraDemo)
官方的演示demo里面还有个面部识别。
最后如果你想监听相机的对焦事件的话
再viewWillApper里面添加个监听
|
|
然后实现下面方法
|
|
最后别忘了再viewDidDisapper方法里移除监听
|
|