限制在IOS中使用捏合手势缩放图像的最大比例

时间:2011-04-13 09:29:38

标签: iphone objective-c ios scale pinch

我目前能够使用Apple提供的捏合手势识别器进行图像缩放,但是如何限制图像的最大比例?

我一直在使用Apple的SimpleGestureRecognizers sample,它将比例设置为1,并且可以很容易地缩放图像,但是当我删除它时,它会突然跳跃,这不太好。但是,由于它总是设置为1,因此很难跟踪比例。

提前谢谢。

3 个答案:

答案 0 :(得分:8)

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

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

因此,请确保将手势识别器的比例重置为1.要跟踪比例的总变化,您可以为UIImageView或ViewController创建一个实例变量,可能也称为“scale”。 (事实上​​,如果你在drawRect中使用那个新的scale变量来绘制你的图像,你只需要在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 :(得分:1)

如果只在一个地方执行此操作,并且不想对UIView或UIImageView进行子类化,则可以创建一些局部变量来实现相同的结果。

快速

// 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
    }
}

Apple Documentation Handling Pinch Gestures

答案 2 :(得分:0)

gestureRecognizer检查scale sender UIPinchGestureRecognizer属性的选择器方法中,如果它小于您希望缩放的比例,请在图像上应用缩放,否则不要。例如,对于selector,以下方法为pinchGesture

-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
   if(sender.scale<yourScaleLimit)
   {
     //scale up the image
   }

}

谢谢,