如何在自定义相机中实现“捏放大”
Posted
技术标签:
【中文标题】如何在自定义相机中实现“捏放大”【英文标题】:How to implement "pinch to zoom" in custom camera 【发布时间】:2016-02-06 20:42:00 【问题描述】:我有一个自定义的照片/摄像机(想想 Snapchat),它带有一个捏识别器来放大/缩小。根据我在网上找到的一些代码,这是正确的:
在某种程度上可以正常放大 捕获图像会捕获缩放的图像以下是我需要帮助的问题:
缩小会导致崩溃 虽然可以放大,但如果我放大,似乎会重置缩放,停止触摸屏幕,然后再次尝试放大。 捕捉视频会重置缩放这是我的捏合手势代码,应该改变什么?
for input in self.captureSession.inputs
// check that the input is a camera and not the audio
if input.device == self.frontCameraDevice || input.device == self.backCameraDevice
if pinch.state == UIGestureRecognizerState.Changed
let device: AVCaptureDevice = input.device
let vZoomFactor = pinch.scale
do
try device.lockForConfiguration()
if vZoomFactor <= device.activeFormat.videoMaxZoomFactor
device.videoZoomFactor = vZoomFactor
device.unlockForConfiguration()
catch _
【问题讨论】:
【参考方案1】:您必须根据之前的值设置 videoZoomFactor。
do
try device.lockForConfiguration()
switch gesture.state
case .began:
self.pivotPinchScale = device.videoZoomFactor
case .changed:
var factor = self.pivotPinchScale * gesture.scale
factor = max(1, min(factor, device.activeFormat.videoMaxZoomFactor))
device.videoZoomFactor = factor
default:
break
device.unlockForConfiguration()
catch
// handle exception
您应该保存以前的比例因子以便从当前缩放状态开始放大/缩小,上面示例中的 self.pivotPinchScale 是关键。 我希望你能从下面的例子中得到一些提示。
https://github.com/DragonCherry/CameraPreviewController
【讨论】:
【参考方案2】:当你缩小 pinch.scale 值会小于 1.0 时,应用会崩溃。
方法-1
//just change this line
if pinch.scale > 1.0
device.videoZoomFactor = vZoomFactor
else
device.videoZoomFactor = 1.0 + vZoomFactor
方法 - 2
你可以通过改造avcapturesession预览层来实现pinch zoom。
yourPreviewLayer.affineTransForm = CGAffineTransformMakeScale(1.0 + pinch.scale.x, 1.0 +pinch.scale.y)
当调用视频捕获方法时,将预览层转换为身份。所以它会重置缩放。
yourPreviewLayer.affineTransForm = CGAffineTransformIdentity
【讨论】:
以上是关于如何在自定义相机中实现“捏放大”的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义 Spring 存储库中实现自定义方法? [复制]
如何在自定义 delphi 组件中实现 stringlist 属性?
如何在自定义 UIButton 中实现 .isHighlighted 动画?