如何实现"捏缩放"在自定义相机

时间:2016-02-06 20:42:01

标签: ios swift

我有一个自定义照片/摄像机(想想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 _{
                    }
                }

            }
        }

2 个答案:

答案 0 :(得分:3)

您必须根据以前的值设置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

答案 1 :(得分:0)

缩小时,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预览图层来实现缩放缩放。

 yourPreviewLayer.affineTransForm = CGAffineTransformMakeScale(1.0 + pinch.scale.x, 1.0 +pinch.scale.y)

当视频捕获方法调用将预览图层转换为标识时。所以它会重置缩放。

 yourPreviewLayer.affineTransForm = CGAffineTransformIdentity