简体   繁体   English

如何从以前的比例开始捏缩放手势?

[英]How to start a Pinch Zoom Gesture from previous scale?

I'm trying to use a Pinch Gesture Recognizer to scale a UITextView up and down, however it always starts at a scale of 1.0.我正在尝试使用捏合手势识别器来上下缩放 UITextView,但它始终以 1.0 的比例开始。 I've tried to implement these answers:我试图实现这些答案:
iOS Pinch Zoom Start from Previous Scale iOS 捏缩放从上一个比例开始
UIPinchGestureRecognizer. UIPinchGestureRecognizer。 Make zoom in location of fingers, not only center 放大手指的位置,而不仅仅是中心
Pinch gesture scale resetting to 1? 捏合手势比例重置为 1?

but i must be doing something wrong, because it still resets to a scale of 1.0 each time.但我一定是做错了什么,因为它每次仍然重置为 1.0 的比例。 Here's my code:这是我的代码:

@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

    }
}

The variable lastScale will always be 1 because this method is deleted out of memory once it is used, until it is called again.变量lastScale将始终为1因为此方法一旦使用就会从内存中删除,直到再次调用为止。 Therefore, lastScale will always reset to 1. On top of that, you have recognizer.state == began and setting lastScale = 1 which means that everytime a new touch is called, lastscale = 1 .因此, lastScale将始终重置为 1。除此之外,您还需要recognizer.state == began lastScale = 1 recognizer.state == began并设置lastScale = 1 ,这意味着每次调用新触摸时, lastscale = 1

What you should be doing is creating a global variable, not local variable, and adjusting that scale.您应该做的是创建一个全局变量,而不是局部变量,并调整该比例。 This will allow it to not reset back to 1 everytime.这将允许它不会每次都重置回 1。 Also, don't ever reset lastScale unless you press some reset function.此外,除非您按下某些重置功能,否则永远不要重置lastScale Think about it - why would you want to reset your lastScale after it is set?想一想 - 为什么要在设置 lastScale 后重置它?

In swift 5, you can just do this:在 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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM