0

ビューにジェスチャ認識機能を追加しようとしています。パン(移動用)とピンチ(スケール用)の両方を追加すると、奇妙な動作が発生します。

ビュー(たまたまimageViewが含まれている)が拡大縮小された後、パンジェスチャレコグナイザーは移動の効果を倍増させるようです。または、元のスケールを想定しているため、移動が本来よりも速くなりますか?

移動およびスケーリングするメソッドのコードは次のとおりです。

//ivars for gesture recognizers/transforms
CGFloat scale;
CGFloat rotation;
CGPoint translatedPoint;
CGFloat _lastScale;
CGFloat _lastRotation;  
CGFloat _firstX;
CGFloat _firstY;

-(void)scale:(id)sender {
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
        _lastScale = 1.0;
    }
    scale = 1.0 - (_lastScale - [(UIPinchGestureRecognizer*)sender scale]);
    CGAffineTransform currentTransform = gestureView.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
    [gestureView setTransform:newTransform];
    _lastScale = [(UIPinchGestureRecognizer*)sender scale];
    NSLog(@"gestureView origin x: %f, y: %f", gestureView.frame.origin.x, gestureView.frame.origin.y);
    NSLog(@"gestureView center x: %f, y: %f",[gestureView center].x, [gestureView center].y);
    NSLog(@"gestureView scale x: %f, scale y: %f", gestureView.frame.size.width, gestureView.frame.size.height);

}

-(void)move:(id)sender {
    translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:gestureView];
    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
        _firstX = [gestureView center].x;
        _firstY = [gestureView center].y;
    }
    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y);
    [gestureView setCenter:translatedPoint];
    NSLog(@"gestureView origin x: %f, y: %f", gestureView.frame.origin.x, gestureView.frame.origin.y);
    NSLog(@"gestureView center x: %f, y: %f",[gestureView center].x, [gestureView center].y);
}

プロジェクトは次のとおりです: owolf.net/uploads/StackOverflow/GestureRecognizerTest.zip

読んでくれてありがとう!

4

1 に答える 1

1

あなたはgestureView内で翻訳を求めています。これにより、スケーリングされた翻訳が得られます。ジェスチャビューが50%に縮小された場合、x軸に沿って10ピクセル移動すると、translatedPoint値がx = 20になります。これは、「外側」の10ピクセルが縮小された(「高解像度」)ジェスチャビューの2倍になるためです。

次に、それをgestureViewのフレームに適用します(中央は、フレームをに設定する便利なメソッドですcenter.x - frame.size.width/2, center.y - frame.size.height/2, frame.size)。これは、スケールの影響を受けることを意味します。

おそらくやりたいことは、translationInView:呼び出しを変更して、それ自体でgestureView.superviewはなく、調べるgestureViewことです。

于 2012-08-10T08:36:59.847 に答える