如何限制UIPinchGestureRecognizer中捏合缩放的最大/最小比例

3

如何限制UIPinchGestureRecognizer的缩放范围,使其保持在最小和最大级别之间?(不使用UIScrollView) 我想将最大尺寸设置为图像的宽度和高度。

var pichCenter : CGPoint!
var touchPoint1 : CGPoint!
var touchPoint2 : CGPoint!
let maxScale : CGFloat = 1
var pinchStartImageCenter : CGPoint!

@objc func pinchAction(gesture: UIPinchGestureRecognizer) {

    if gesture.state == UIGestureRecognizerState.began {

        pinchStartImageCenter = imageView.center
        touchPoint1 = gesture.location(ofTouch: 0, in: self.view)
        touchPoint2 = gesture.location(ofTouch: 1, in: self.view)


        pichCenter = CGPoint(x: (touchPoint1.x + touchPoint2.x) / 2, y: (touchPoint1.y + touchPoint2.y) / 2)

    } else if gesture.state == UIGestureRecognizerState.changed {

        var pinchScale :  CGFloat
        if gesture.scale > 1 {
            pinchScale = 1 + gesture.scale/100
        }else{
            pinchScale = gesture.scale
        }
        if pinchScale*self.imageView.frame.width < editPhotoView.frame.width {
            pinchScale = editPhotoView.frame.width/self.imageView.frame.width
        }
        scaleZoomedInOut *= pinchScale

        let newCenter = CGPoint(x: pinchStartImageCenter.x - ((pichCenter.x - pinchStartImageCenter.x) * pinchScale - (pichCenter.x - pinchStartImageCenter.x)),y: pinchStartImageCenter.y - ((pichCenter.y - pinchStartImageCenter.y) * pinchScale - (pichCenter.y - pinchStartImageCenter.y)))
        self.imageView.frame.size = CGSize(width: pinchScale*self.imageView.frame.width, height: pinchScale*self.imageView.frame.height)
        imageView.center = newCenter
    }
}
1个回答

3

如果您已经有最大尺寸,则只需将其与最大尺寸进行比较并设置新尺寸即可。

在设置新框架之前,请检查该值是否超过最大值或小于最小值。如果是,则不要更改框架。

let newWidth = pinchScale * self.imageView.frame.width
let newHeight = pinchScale * self.imageView.frame.height

// You need to have the maximum and minimum values for comparison already stored
if (newWidth >= minimumWidth && newWidth <= maximumHeight) && (newHeight >= minimumHeight && newHeight <= maximumHeight) {
    imageView.frame.size = CGSize(width: newWidth, height: newHeight)
}

注意:您可能还想将相同的逻辑应用于捏合期间发生变化的其他事物,例如中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接