iOS UIPinchGestureRecognizer在UIGestureRecognizerStateEnded状态下获取未知来源的偏移量

时间:2012-12-03 10:12:24

标签: ios ipad uiview zoom uipinchgesturerecognizer

我有一个带有自定义drawRect()方法的UIView,用于某些绘图。

我使用UIPinchGestureRecognizer来实现缩放效果。

这是行动方法:

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer
{
    //NSLog(@"Pinch gesture recognized");

    CGPoint touchOrigin = [recognizer locationInView:self];
    _currentScaleOrigin = touchOrigin;

    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"%16@ x = %f, y = %f", @"Pinch end:", touchOrigin.x, touchOrigin.y);
        return;
    }

    if (recognizer.state == UIGestureRecognizerStateChanged)
    {
        //NSLog(@"scale = %f", recognizer.scale);
        NSLog(@"%16@ x = %f, y = %f", @"Pinch origin:", touchOrigin.x, touchOrigin.y);

        // scale has at start a value of 1.0 and increases as fingers moves away from each other
        _currentScaleLevel += recognizer.scale - 1;
        [self setNeedsDisplay]; // call drawRect for redrawing at current scale level
    }

    recognizer.scale = 1;

} 

当收到UIGestureRecognizerStateEnded消息时,我得到一些奇怪的坐标偏移:

Pinch origin: x = 358.000000, y = 630.000000

Pinch origin: x = 355.000000, y = 627.000000

Pinch origin: x = 353.000000, y = 625.000000

Pinch origin: x = 351.000000, y = 624.000000

Pinch origin: x = 351.000000, y = 623.000000

Pinch origin: x = 350.000000, y = 622.000000

Pinch origin: x = 349.000000, y = 622.000000

Pinch origin: x = 349.000000, y = 622.000000

Pinch end: x = 315.000000, y = 750.000000

...和免费翻译:)我不需要。 我不知道翻译的来源。

如何禁用此翻译?

1 个答案:

答案 0 :(得分:0)

解决了它。

接收UIGestureRecognizerStateEnded时,我正在为我的_currentScaleOrigin分配两个手指中的最后一个点,用于执行缩放转换。

我不知道UIPinchGestureRecognizer会在屏幕上返回最后一个手指位置的CGPoint。

这是整个方法代码:

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer
{
#if 1 
    static CGPoint point_0;
    static CGPoint point_1;
    if ([recognizer numberOfTouches] > 1)
    {
        point_0 = [recognizer locationOfTouch:0 inView:self];
        point_1 = [recognizer locationOfTouch:1 inView:self];
        NSLog(@"pinch loc 0: (%f, %f)", point_0.x , point_0.y);
        NSLog(@"pinch loc 1: (%f, %f)", point_1.x , point_1.y);
    } else if ([recognizer numberOfTouches] == 1) {
        point_0 = [recognizer locationOfTouch:0 inView:self];
        NSLog(@"pinch loc 0: (%f, %f)", point_0.x , point_0.y);
    }
#endif

    switch (recognizer.state)
    {
        case UIGestureRecognizerStateBegan:
        {
            CGPoint pointBegin = [recognizer locationInView:self];
            NSLog(@"%16@ x = %f, y = %f", @"Pinch start:", pointBegin.x, pointBegin.y);
        } break;
        case UIGestureRecognizerStateChanged:
        {
            _currentScaleOrigin = [recognizer locationInView:self];

            //NSLog(@"scale = %f", recognizer.scale);
            NSLog(@"%16@ x = %f, y = %f", @"Pinch origin:", _currentScaleOrigin.x, _currentScaleOrigin.y);

            // scale has at start a value of 1.0 and increases as fingers moves away from each other
            _currentScaleLevel += recognizer.scale - 1;
            // call drawRect for redrawing at current scale level
            [self setNeedsDisplay]; 
        } break;
        case UIGestureRecognizerStateEnded:
        {
            CGPoint pointEnded = [recognizer locationInView:self];
            NSLog(@"%16@ x = %f, y = %f", @"Pinch end:", pointEnded.x, pointEnded.y);
            //return;
        } break;
        default : 
        {
            NSLog(@"other state");
        }
    }

    recognizer.scale = 1;
}