2017-04-07 95 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 
    } 
}