【问题标题】:How to start a Pinch Zoom Gesture from previous scale?如何从以前的比例开始捏缩放手势?
【发布时间】:2021-01-11 17:44:54
【问题描述】:

我正在尝试使用捏手势识别器向上和向下缩放 UITextView,但它始终以 1.0 的比例开始。 我试图实现这些答案:
iOS Pinch Zoom Start from Previous Scale
UIPinchGestureRecognizer. Make zoom in location of fingers, not only center
Pinch gesture scale resetting to 1?

但我一定是做错了什么,因为它每次仍然重置为 1.0 的比例。这是我的代码:

@objc func pinchRecognized(recognizer: UIPinchGestureRecognizer) {

var lastScale:CGFloat = 1.0

    if let view = recognizer.view as? UITextView {

        if (recognizer.state == .began) {
            lastScale = 1.0
        }

        let scale = 1.0 - (lastScale - recognizer.scale)

        view.transform = CGAffineTransform(scaleX: scale, y: scale)
        view.font = UIFont.systemFont(ofSize: 40 * scale)

        lastScale = recognizer.scale

    }
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    变量lastScale 将始终为1,因为一旦使用此方法就会从内存中删除,直到再次调用它。因此,lastScale 将始终重置为 1。除此之外,您还有 recognizer.state == began 和设置 lastScale = 1,这意味着每次调用新的触摸时,lastscale = 1

    您应该做的是创建一个全局变量,而不是局部变量,并调整该比例。这将允许它不会每次都重置回 1。另外,除非您按下某些重置功能,否则永远不要重置lastScale。想一想 - 为什么要在设置 lastScale 后重置它?

    【讨论】:

      【解决方案2】:

      在 swift 5 中,您可以这样做:

      @objc func pinchHandler(_ sender: UIPinchGestureRecognizer) {
          guard let view = sender.view else { return }
          view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
          sender.scale = 1
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多