在iOS中使用捏合手势缩放图像时,限制最大比例的方法

6
我目前能够使用苹果提供的捏合手势识别器使图像进行缩放,但是如何限制图像的最大缩放比例呢?我一直在使用苹果的SimpleGestureRecognizers示例,它将比例设置为1,很容易缩放图像,但当我删除它时,它会突然跳变,这不好看。但是,由于其始终设置为1,因此很难跟踪比例。预先感谢您的帮助。
3个回答

9

UIKit会在单个用户手势(捏合)中多次调用您的选择器方法。每次调用将表示比例的小增量(或减少)。如果您处理方法的每次调用并相应地缩放图像以适应每个小的增量,则会得到平滑的动画。

您可以使用识别器的比例属性来修改图像。然后,您将属性重置为1.0,以便下一次调用选择器方法时,比例属性仅表示自上次调用以来的新小增量。然后,您再次按新的小增量重新缩放图像并重置为1.0。如果您不重置识别器的比例并使用它来重新缩放图像,则将通过累积更改来缩放图像,导致跳跃行为(和不正确的缩放)。

因此,请务必将手势识别器的比例重置为1。要跟踪比例的总变化,您可以为UIImageView或ViewController创建一个实例变量,可能也称为“scale”。 (实际上,如果您在drawRect中使用该新比例变量绘制图像,则只需在setter中添加一个调用setNeedsDisplay。当比例发生变化时,您无需编写任何代码即可重新绘制图像。)

无论如何,以下代码(包含Ravin的限制检查,但在新的比例变量上)应该适用于您的选择器方法:

- (void)pinch:(UIPinchGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateChanged ||
        recognizer.state == UIGestureRecognizerStateEnded) {
        if (imageView.scale < yourScaleLimit) {
            imageView.scale *= recognizer.scale;
            //any other code to scale up the image if
            //just changing imageView.Scale is not enough
        }
        recognizer.scale = 1.0;
    }
}

我希望这对您有所帮助。


1
这里,imageView不支持.scale属性。有没有其他解决此错误的方法? - Hemang
2
@Hemang:请注意上面的第三段。imageView.scale是指在UIImageView子类中创建的实例变量,用于跟踪比例尺的累积变化。或者,您可以在视图控制器中创建这样的实例变量,然后将其称为self.imageViewScale。无论哪种方式,您都需要一个新变量来跟踪比例尺的累积变化。 - salo.dm
谢谢你的帮助。我错过了第三段的那部分内容,所以犯了一个错误。谢谢。代码运行良好。 - Hemang

7

如果您只是想在一个地方执行此操作,而且不想子类化UIView或UIImageView,则可以创建一些本地变量以实现相同的结果。

Swift

// Variables to keep track of the scale
var imageViewScale: CGFloat = 1.0
let maxScale: CGFloat = 4.0
let minScale: CGFloat = 0.5

@objc func handlePinchGesture(recognizer: UIPinchGestureRecognizer) {

    if recognizer.state == .began || recognizer.state == .changed {
        let pinchScale: CGFloat = recognizer.scale

        if imageViewScale * pinchScale < maxScale && imageViewScale * pinchScale > minScale {
            imageViewScale *= pinchScale
            imageView.transform = (imageView.transform.scaledBy(x: pinchScale, y: pinchScale))
        }
        recognizer.scale = 1.0
    }
}

苹果官方文档:处理捏合手势


0
gestureRecognizer的选择器方法中,检查sender(UIPinchGestureRecognizer)的scale属性是否小于您希望缩放的值,如果是,则对图像应用缩放,否则不要。例如,以下方法是pinchGestureselector
-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
   if(sender.scale<yourScaleLimit)
   {
     //scale up the image
   }

}

谢谢,


1
缩放是两个pinchAction调用之间的相对值,并在每个pinchAction调用后设置为1。因此,它不是您原始视图大小与当前视图大小之间的绝对关系。 - Seega

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