Objective c 从收缩位置缩放在CGContext上绘制的图像

Objective c 从收缩位置缩放在CGContext上绘制的图像,objective-c,zooming,cgcontext,Objective C,Zooming,Cgcontext,此问题是前一段时间另一个SO问题的后续问题:。我的变焦工作得近乎完美,但它仍然会使绘制的图像“跳跃”,正如我所说的那样。代码中最重要的部分如下所示: 当观察到夹点事件时,此方法称为: [代码片段1] - (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender { float previousZoomLevel = zoomLevel; UIPinchGestureRecognizer *pinch = (UIPinch

此问题是前一段时间另一个SO问题的后续问题:。我的变焦工作得近乎完美,但它仍然会使绘制的图像“跳跃”,正如我所说的那样。代码中最重要的部分如下所示:

当观察到夹点事件时,此方法称为:

[代码片段1]

- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
    float previousZoomLevel = zoomLevel;
    UIPinchGestureRecognizer *pinch = (UIPinchGestureRecognizer *)sender;

    float zoomIncreaseFactor = [self getZoomFactor:[pinch scale]]; //= 13 or 7 or 10
    float estimatedDelta = (previousZoomLevel * zoomIncreaseFactor) / 150;

    if ([pinch scale] > previousScale) {
        zoomLevel += estimatedDelta;
    }

    if ([pinch scale] < previousScale) {
        zoomLevel -= estimatedDelta;
    }

    previousScale = [pinch scale];

    if (zoomLevel < MIN_ZOOM_LEVEL) {
        zoomLevel = MIN_ZOOM_LEVEL;
    }

    if (zoomLevel > MAX_ZOOM_LEVEL) {
        zoomLevel = MAX_ZOOM_LEVEL;
    }

    CGPoint loc = [pinch locationInView:self];

    NSLog(@"loc: {%.1f,%.1f}, lastPinchLoc: {%.1f,%.1f}", loc.x,loc.y,lastPinchLocation.x,lastPinchLocation.y);

    //uncomment the below part to always zoom from the first zoom location.
    //if (lastPinchLocation.x != 0 && lastPinchLocation.y != 0) {
        //loc.x += lastPinchLocation.x - loc.x;
        //loc.y += lastPinchLocation.y - loc.y;
    //}

    //NSLog(@"newLastPinchLocation: {%.1f,%.1f}", loc.x,loc.y);

    lastPinchLocation = loc;

    hasBeenMoved = YES;

    if (zoomLevel != previousZoomLevel) {
        [self setNeedsDisplay];
    }
}
在CGContext上绘制项目之前,x和y被放入这个方法中,我在返回的位置绘制项目。类变量“zoomTouchLocation”与上述代码段中的“lastPinchLocation”具有相同的值

[代码片段2]

- (CGPoint)handleCoordinatesX:(float)x y:(float)y {
    x -= zoomTouchLocation.x;
    y -= zoomTouchLocation.y;

    x = x * zoomLevel;
    y = y * zoomLevel;

    x += zoomTouchLocation.x;
    y += zoomTouchLocation.y;

    return CGPointMake(x, y);
}
如果我每次都在大致相同的位置进行挤压,它将按预期工作,但当我在整个屏幕上挤压时,图像会疯狂地跳跃

现在基本上我的问题是,是否有人能帮我解决这个“跳跃”问题,让图像从我放大的位置缩放而不跳跃。如果您需要更多信息,请在下面的评论中询问


(我知道我的代码出现跳转是很正常的,我就是找不到阻止跳转的方法)

如果没有完整的代码,很难帮助您,但是您应该尝试将view.layer.ancorpoint设置为您的pinchLocation(如果尚未设置)。
这样,当转换完成时,这一点不会移动。对于旋转或缩放非常有用。

在离散事件期间,应跟踪和/或重置缩放增量和坐标。也就是说,您需要了解并使用UIPinchGestureRecognizer.state来确定在何处重置跟踪逻辑和增量,以及何时更新缩放位置的跟踪坐标


这方面的一个基本示例来自Touchs示例:

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
{
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
        [gestureRecognizer setScale:1];
    }
}

你试过过滤输入值吗?i、 不允许有太多的跳跃?另一个问题是-当它从300多到700多-你会怎么做?可能是你在另一个视图(即不同的坐标系)上触发的吗?不,我现在没有过滤输入(我下周会尝试),我也没有在不同的坐标系上工作。问题是,实际的挤压姿势与之前的完全不同。那是跳跃的时候occurs@hims056-嗯,你是对的,那有点傻。我想我会先喝杯咖啡。我没有使用苹果提供的官方缩放方法。在我画东西之前,我使用[code snippet 2]中的方法缩放它。这样,它显示了从收缩点开始缩放的网络,效果很好,但是当用户决定在屏幕上的不同位置进行收缩时,它会跳转。为了调试它,您应该检查你的收缩位置是否从未移动过。一种图形化的方法是在图层上显示一个红色按钮,并检查它是否移动。我在错误的坐标系下工作。你的评论让我找到了正确的地方,谢谢!
- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
{
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
        [gestureRecognizer setScale:1];
    }
}