0

私はAVFoundationAVCaptureDeviceで「ピンチ・ツー・ズーム」機能を実装しようとしています:AVCaptureDevice videoZoomFactorピンチ・ツー・ズームレート

@IBAction func pinchGestureDetected(_ gestureRecognizer: UIPinchGestureRecognizer) { 

    switch gestureRecognizer.state { 
    case .began: 
     print ("began") 
     self.currenZoomFactor = self.videoDevice!.videoZoomFactor 
     do { 
      try self.videoDevice!.lockForConfiguration() 
     } catch let error as NSError { 
      NSLog("Could not lock device for configuration: %@", error) 
     } 

    case .changed: 
     print ("changed") 

      var zoomValue : CGFloat = ((gestureRecognizer.scale) - 1) + self.currenZoomFactor 
      if zoomValue > min(10.00, self.videoDevice!.activeFormat.videoMaxZoomFactor) { 
       zoomValue = min(10.00, self.videoDevice!.activeFormat.videoMaxZoomFactor) 

      } else if zoomValue < 1.00 { 
       zoomValue = 1.00 
      } 

      self.videoDevice!.videoZoomFactor = sentZoomValue 

    case .ended, .cancelled: 
     print ("ended/canceld") 
     self.videoDevice!.unlockForConfiguration() 

    default: 
     break 
    } 

} 

以上が正常に動作します。しかし、上記の場合、ズーム率はピンチスケールの直線です。これにより、ズーム倍率を上げるほどズームが非常に遅くなります。

ズーム倍率を上げても、ズーム倍率を上げる方法を教えてください。

答えて

2

ズーム速度を高速化するには、以下の計算が必要です。

あなたは

@IBAction func pinchGestureDetected(_ gestureRecognizer: UIPinchGestureRecognizer) { 
    zoomto(scale: gestureRecognizer.scale, hasBegunToZoom:(gestureRecognizer.state == .began)) 
} 
以下のように呼び出すことができます pinchGestureDetected

func zoomto(scale: CGFloat, hasBegunToZoom: Bool) { 

    if hasBegunToZoom { 
     initialPinchZoom = captureDevice.videoZoomFactor 
    } 
    do { 
     try captureDevice.lockForConfiguration() 
     if scale < 1.0 { 
      zoomFactor = initialPinchZoom - pow(captureDevice.activeFormat.videoMaxZoomFactor, 1.0 - scale) 
     } 
     else { 
      zoomFactor = initialPinchZoom + pow(captureDevice.activeFormat.videoMaxZoomFactor, (scale - 1.0f)/2.0f) 
     } 
     zoomFactor = min(10.0, zoomFactor) 
     zoomFactor = max(1.0, zoomFactor) 
     captureDevice.videoZoomFactor = zoomFactor 
     captureDevice.unlockForConfiguration() 
    } catch let error as NSError { 
     NSLog("Could not lock device for configuration: %@", error) 
    } 
} 

からこのユーティリティメソッドを呼び出すことができます

関連する問題