我有一个自定义照片/摄像机(想想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 _{
}
}
}
}
答案 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在上面的例子中是关键。 我希望你能从以下例子中得到一些提示。
答案 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