2

私は現在、次のコードを使用してパン/ズームしたいレイヤー内にマップ(タイルマップ)を持っています:

- (void) pinchGestureUpdated: (UIPinchGestureRecognizer *) recognizer {

    if([recognizer state] == UIGestureRecognizerStateBegan) {

            _lastScale = [recognizer scale];

            CGPoint touchLocation1 = [recognizer locationOfTouch:0 inView:recognizer.view];
            CGPoint touchLocation2 = [recognizer locationOfTouch:1 inView:recognizer.view];

            CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)];
            _pinchCenter = [self convertToNodeSpace:centerGL];
    }

    else if ([recognizer state] == UIGestureRecognizerStateChanged) {

//        NSLog(@"%d", recognizer.scale);

        CGFloat newDeltaScale = 1 -  (_lastScale - [recognizer scale]);
        newDeltaScale = MIN(newDeltaScale, kMaxScale / self.scale);
        newDeltaScale = MAX(newDeltaScale, kMinScale / self.scale);

        CGFloat newScale = self.scale * newDeltaScale;

        //self.scale = newScale;
        [self scale: newScale atCenter:_pinchCenter];

        _lastScale = [recognizer scale];
    }
}

- (void) scale: (CGFloat) newScale atCenter: (CGPoint) center {

    CGPoint oldCenterPoint = ccp(center.x * self.scale, center.y * self.scale);

    // Set the scale.
    self.scale = newScale;

    // Get the new center point.
    CGPoint newCenterPoint = ccp(center.x * self.scale, center.y * self.scale);

    // Then calculate the delta.
    CGPoint centerPointDelta  = ccpSub(oldCenterPoint, newCenterPoint);

    // Now adjust your layer by the delta.
    self.position = ccpAdd(self.position, centerPointDelta);
}

私の問題は、この方法でズームインしているときにズームを変更しようとしているにもかかわらず、ピンチの中心でズームが有効になっていないことです (void) scale: (CGFloat) newScale atCenter: (CGPoint) center。これが適切に行われない理由はありますか? また、ピンチの中心位置をシーン/レイヤーの座標系に変換するにはどうすればよいですか?

4

2 に答える 2

1

私のアプローチでは、すべてが実際には問題ありませんでした。私が抱えていた問題は、レイヤーanchor pointが私が定義したマップとは異なり、スケーリング中にオフセットを導入していたことです。両方のアンカーを に設定する必要がありましたccp(0,0)

ピンチ ジェスチャの中心の画面座標からレイヤーへの変換は正しく、UIKIt を使用する場合は次の手順で実現できますgesture recognizers

CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)];
_pinchCenter = [self convertToNodeSpace:centerGL];
于 2013-10-01T08:56:52.103 に答える
0

まず、状態がビットフィールドであるため、 ([認識状態] == UIGestureRecognizerStateBegan) を行うことはできませ! だからあなたはしなければなりません:

([認識状態] & UIGestureRecognizerStateBegan)

ピンチの中心位置は基本的に画面上の座標になります。それを独自の座標系に変換する方法に関しては、ジェスチャーの開始時に表示されるシーン/レイヤーの部分のデバイスの画面上の境界を把握する必要があります。これは、画面のピクセル グリッドを表す 10,10 x 200,200 などの座標になります。次に、独自のアプリのシーン/レイヤーの座標系で、10,10 が何にマップされ、200,200 が何にマップされるかを把握する必要があります。そこから、ピンチ ジェスチャの中心の画面座標に適用する係数を導出できます。これにより、ピンチ ジェスチャの画面座標がシーン/レイヤー座標に変換されます。

シーン/レイヤーをスケーリングすると、ビューの中心にないポイントを中心にスケーリングするため、やろうとしていることはトリッキーです。マップ関連のアプリの 1 つで Apple のサンプル コードを調べれば、おそらくこの種のピンチ ズームを含むメソッドの例をいくつか見つけることができると思います。

これが役立つことを願っています。

于 2013-10-01T01:18:56.193 に答える