0

Je suis en train de mettre en œuvre 'pinch-to-zoom' avec fonction AVCaptureDevice dans AVFoundation:AVCaptureDevice videoZoomFactor pinch-to-zoom Taux

@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 
    } 

} 

Au-dessus fonctionne très bien. Cependant, avec ci-dessus, taux de zoom est linéaire avec échelle de pincement. Cela rend le zoom beaucoup plus lent à des facteurs de zoom plus élevés.

Comment obtenir des taux de zoom accélérés à des facteurs de zoom plus élevés?

Répondre

2

Pour obtenir des taux de zoom accélérés, nous avons besoin des calculs ci-dessous.

Vous pouvez appeler cette méthode utilitaire à partir de votre 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) 
    } 
} 

Vous pouvez appeler comme ci-dessous

@IBAction func pinchGestureDetected(_ gestureRecognizer: UIPinchGestureRecognizer) { 
    zoomto(scale: gestureRecognizer.scale, hasBegunToZoom:(gestureRecognizer.state == .began)) 
}