如何降低捏合缩放手势识别器的速度?

5

我创建了一个类似于这个UIGestureRecognizer

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

        // Constants to adjust the max/min values of zoom
        const CGFloat kMaxScale = 2.0;
        const CGFloat kMinScale = 1.0;

        CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]); 
        newScale = MIN(newScale, kMaxScale / currentScale);   
        newScale = MAX(newScale, kMinScale / currentScale);
        CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
        [gestureRecognizer view].transform = transform;

        lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call  
    }
}

这个功能按预期工作,但我的客户希望它对触摸的敏感度更低。我该如何减少捏合(向内和向外)的速度,使其以默认速度的约80%缩放?


你尝试手动设置scrollViewzoomScale了吗? - Nicolas Bonnet
@NicolasBonnet 很不幸,这个特定的内容没有包含在滚动视图中,所以做那样的事情是不可行的 :| - brandonscript
3个回答

0

你尝试过将当前值 缩放 到80%吗?

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

    CGFloat maxScale = 2.0;
    CGFloat currentScale = [gestureRecognizer scale];
    currentScale = 0.8 * currentScale;   //80% of scaling

    if(currentScale < 0.8)
        currentScale = 0.8;

    if(currentScale > maxScale)
        currentScale = maxScale;

    [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], currentScale, currentScale);

}

我认为这也可以运行,但是为什么要裁剪你的比例值,我不认为有这个必要。 - tiguero
裁剪比例值可以限制您的缩放属性。 - Himanshu Joshi
好的,抱歉,我看得太快了,漏掉了原始代码中的那一部分。 - tiguero
不行,完全不起作用 - 有一些非常奇怪的相反效果 :| - brandonscript

0

试试这个。

- (void)handlePinching:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        if (CGRectIsEmpty(self.initalFrame)) {
            self.initalFrame = gestureRecognizer.view.frame;
            // store view's original frame and never change it
        }

        if (self.preScale == 0.f) {
            self.preScale = 1.f; 
        }

        gestureRecognizer.scale = self.preScale;
        // gestureRecognizer and view should share the same scale state at the beginning
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        const CGFloat kMaxScale = 2.0;
        const CGFloat kMinScale = 1.0;

        CGFloat newScale = gestureRecognizer.scale;

        newScale = (newScale - self.preScale) * 0.8 + self.preScale;

        newScale = MIN(newScale, kMaxScale);
        newScale = MAX(newScale, kMinScale);


        CGRect newFrame = self.initalFrame;
        newFrame.size.height *= newScale;
        newFrame.size.width *= newScale;
        gestureRecognizer.view.frame = newFrame;
        self.preScale = newScale;
    }

}

要点如下:

  • 使用框架来实现比例尺。
  • 对比例尺变量的更改进行调整,以实现缓慢/快速缩放。

经过一番尝试,但似乎什么都行不通。 - brandonscript

0
原来缩放过快实际上是链接答案代码中的一个错误。不幸的是,这并没有真正回答我的问题(我仍然希望得到答案!),但它确实解决了我的客户的问题。
请注意,在底部添加了一行代码,将gestureRecognizer重置为1:
- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer {

        ...

        lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call  

        gestureRecognizer.scale = 1;
        // ^ added this line
    }
}

哦,是的,我没有在我的代码中添加那一行,这是我的错误。 - Himanshu Joshi
@HimanshuJoshi 嗯,你让我想了一下 - 或许你的建议加上那行代码后真的会奏效。我要试一下。 - brandonscript

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