在图像空闲一段时间之后,UIPanGestureRecognizer会在移动之前卡住

时间:2011-08-03 19:32:27

标签: iphone ios cocoa-touch core-graphics uigesturerecognizer

因此,我正在制作一个简单的iPhone应用程序,可让您移动/缩放已在视图中导入的图像。我正在使用UIGestureRecognizers和@paulsolt的代码来实现这一目标。它很棒。我遇到的唯一问题是,当我在没有触摸屏幕或暂时执行任何其他操作后移动物体时,在开始平滑移动之前会有轻微的打嗝。

有谁知道如何解决这个问题?

    - (void)addGestureRecognizersToView:(UIView *)theView {
            theView.userInteractionEnabled = YES;  // Enable user interaction

            UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
            [panGesture setMaximumNumberOfTouches:2];
            [panGesture setDelegate:self];
            [theView addGestureRecognizer:panGesture];
            [panGesture release];


            UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
            [theView addGestureRecognizer:pinchGesture];
            [pinchGesture release];
        }


    - (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 = 1.5;
                const CGFloat kMinScale = 1.0;
                const CGFloat kSpeed = 0.75;

                CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]) * (kSpeed); 
                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  
            }
        }

    - (void)handlePanGesture:(UIPanGestureRecognizer *)gestureRecognizer {

        UIView *myView = [gestureRecognizer view];

        CGPoint translate = [gestureRecognizer translationInView:[myView superview]];


        if ([gestureRecognizer state] == UIGestureRecognizerStateChanged || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
            [myView setCenter:CGPointMake(myView.center.x + translate.x, myView.center.y + translate.y)];
        [gestureRecognizer setTranslation:CGPointZero inView:[myView superview]];
        }
    }

2 个答案:

答案 0 :(得分:0)

也许是因为你执行此操作[panGesture setMaximumNumberOfTouches:2];,它必须确保在移动视图之前当前操作没有收缩?

答案 1 :(得分:0)

当图像拾取器选择iPhone相机拍摄的照片时,会发生这种情况。对于其他图像,它似乎工作正常。不知道如何解决这个问题。