2017-04-07 79 views
1

我想实现一个简单的捏缩放手势在QR应用程序。
它似乎很简单,所以我做了一些研究,我发现了一些可能的答案的问题:如何实现捏捏放大相机(Swift 3)?

AVCaptureDevice Camera Zoom
How to implement "pinch to zoom" in custom camera
Pinch to zoom camera
Zooming while capturing video using AVCapture in iOS

不幸的是无那些真正解决它,因为我想要的, 我个人喜欢第一个(在Objective-C中),我试图在Swift 3中完成它。

我发布了一个答案h上我想出了一些尝试后的代码,其他的更容易/更好/更简单的解决方案,欢迎:)

+2

发布自己的问题和答案很好,但问题和答案都必须遵守正常的规则,以获得良好的问题和答案。这个问题不是由本网站的规则接受的问题。请更新它,使其成为一个适当的问题。 – rmaddy

回答

3

我从故事板中使用的Pinch Gesture Recognizer,再挂这个动作:

@IBAction func pinchToZoom(_ sender: UIPinchGestureRecognizer) { 

     guard let device = captureDevice else { return } 

     if sender.state == .changed { 

      let maxZoomFactor = device.activeFormat.videoMaxZoomFactor 
      let pinchVelocityDividerFactor: CGFloat = 5.0 

      do { 

       try device.lockForConfiguration() 
       defer { device.unlockForConfiguration() } 

       let desiredZoomFactor = device.videoZoomFactor + atan2(sender.velocity, pinchVelocityDividerFactor) 
       device.videoZoomFactor = max(1.0, min(desiredZoomFactor, maxZoomFactor)) 

      } catch { 
       print(error) 
      } 
     } 
    } 

注意captureDevice是类AVCaptureDevice的可选对象。

0
@IBAction func pinchToZoom(_ sender: UIPinchGestureRecognizer) { 

    guard let device = captureDevice else { return } 

    func minMaxZoom(_ factor: CGFloat) -> CGFloat { return min(max(factor, 1.0), device.activeFormat.videoMaxZoomFactor) } 

    func update(scale factor: CGFloat) { 
    do { 
     try device.lockForConfiguration() 
     defer { device.unlockForConfiguration() } 
     device.videoZoomFactor = factor 
    } catch { 
     debugPrint(error) 
    } 
    } 

    let newScaleFactor = minMaxZoom(pinch.scale * zoomFactor) 

    switch sender.state { 
    case .began: fallthrough 
    case .changed: update(scale: newScaleFactor) 
    case .ended: 
     zoomFactor = minMaxZoom(newScaleFactor) 
     update(scale: zoomFactor) 
    default: break 
    } 
}