UIPanGestureRecognizer застревает перед перемещением после того, как изображение немного простаивает - PullRequest
0 голосов
/ 03 августа 2011

Итак, я делаю простое приложение для iPhone, которое позволяет перемещать / масштабировать изображения, которые были импортированы в виде. Я использую UIGestureRecognizer с кодом @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 голосов
/ 05 августа 2011

Это происходит, когда средство выбора изображений выбирает фотографию, сделанную камерой iPhone.Для других изображений это работает нормально.Не уверен, как это исправить.

0 голосов
/ 04 августа 2011

Может быть, потому что вы делаете это [panGesture setMaximumNumberOfTouches:2];, оно должно гарантировать, что текущее действие не сжимается перед перемещением вашего вида?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...