6

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

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

先感谢您。

4

3 回答 3

9

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

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

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

在任何情况下,以下代码(包含 Ravin 的限制检查,但在新的 scale 变量上)应该适用于您的选择器方法:

- (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;
    }
}

我希望这是有帮助的。

于 2011-04-13T11:21:55.193 回答
6

如果您只在一个地方执行此操作并且您不想将 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 文档处理捏合手势

于 2018-07-09T23:17:58.160 回答
0

gestureRecognizer检查( )scale属性的选择器方法中,如果它小于您希望缩放的值,请在图像上应用缩放,否则不要。例如,以下方法适用于then 。senderUIPinchGestureRecognizerselectorpinchGesture

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

}

谢谢,

于 2011-04-13T09:36:15.603 回答