首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现相机缩放(Swift 3)?

如何实现相机缩放(Swift 3)?
EN

Stack Overflow用户
提问于 2017-04-07 12:52:30
回答 2查看 4.4K关注 0票数 3

我想实现一个简单的捏缩放姿态在一个QR应用程序。

这似乎很简单,所以我做了一些研究,找到了一些解决这个问题的可能答案:

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中),我试着用Swift 3来解决它。

我用我想出的代码发布了一个答案,经过一些尝试,其他更简单/更好/更简单的解决方案都受到欢迎:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-07 12:52:30

我使用了故事板中的Pinch Gesture Recognizer,然后链接到这个操作:

代码语言:javascript
复制
@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的一个可选对象。

票数 13
EN

Stack Overflow用户

发布于 2017-12-24 01:11:07

代码语言:javascript
复制
@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(sender.scale * zoomFactor)

  switch sender.state {
    case .began: fallthrough
    case .changed: update(scale: newScaleFactor)
    case .ended:
      zoomFactor = minMaxZoom(newScaleFactor)
      update(scale: zoomFactor)
    default: break
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43278701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档