1

ピンチインとピンチアウトに基づいて、コンテキスト上で図面をズームしようとしています。これは完全に機能していますが、常に原点(左上)からズームします。これは、他のアプリケーションで得られる素晴らしい効果をもたらさず、本当に迷惑です。古いズーム方法は次のとおりです。

- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
    UIPinchGestureRecognizer *pinch = (UIPinchGestureRecognizer *)sender;

    if ([pinch scale] > zoomLevel + MAX_ZOOM_PER_CALL) {
        [pinch setScale: zoomLevel + MAX_ZOOM_PER_CALL];
    }

    if ([pinch scale] < zoomLevel - MAX_ZOOM_PER_CALL) {
        [pinch setScale:zoomLevel - MAX_ZOOM_PER_CALL];
    }

    float prevZoomLevel = zoomLevel;
    CGFloat factor = [pinch scale];
    zoomLevel = factor;

    if (zoomLevel < MIN_ZOOM_LEVEL) {
        zoomLevel = MIN_ZOOM_LEVEL;
    }

    if (zoomLevel > MAX_ZOOM_LEVEL) {
        zoomLevel = MAX_ZOOM_LEVEL;
    }

    //The next piece of code is added here

    [self setNeedsDisplay];
}

実際のズームは、コンテキストに表示されているパーツの描画方法で行われます。これをシミュレートするために、画面の原点(つまり、描画されるアイテムに対する相対的な原点)を変更することを考えていました。しかし、それはまったく機能していません、これは私が今持っているものです:

float dZoomLevel = zoomLevel - prevZoomLevel;

if (dZoomLevel != 0) {
    CGPoint touchLocation = [pinch locationInView:self];
    CGPoint zoomedTouchLocation = CGPointMake(touchLocation.x * prevZoomLevel, touchLocation.y * prevZoomLevel);
    CGPoint newLocation = CGPointMake(touchLocation.x * zoomLevel, touchLocation.y * zoomLevel);

    float dX = ( newLocation.x - zoomedTouchLocation.x );
    float dY = ( newLocation.y - zoomedTouchLocation.y );

    _originX += roundf(dX);
    _originY += roundf(dY);
}

原点はxml(すべての要素の最小のxとy)から取得されます。通常は12000から20000の間ですが、理論的には0から100000の間になる可能性があります。

はっきりさせたかどうかはわかりませんが、何か情報が必要な場合や何かわからない場合は、私に聞いてください。できるだけ早く返信します。前もって感謝します!

4

1 に答える 1

0

私は自分で答えを見つけました。私の場合、ズームする必要があるのは、タッチポイントからズームすることです。したがって、x座標とy座標がズームされたら、次のようにします。

x -= pinchLocation.x;
y -= pinchLocation.y;

x *= zoomLevel;
y *= zoomLevel;

x += pinchLocation.x;
y += pinchLocation.y;

または要するに:

x = (x - pinchLocation.x) * zoomLocation + pinchLocation.x;
y = (y - pinchLocation.y) * zoomLocation + pinchLocation.y;

これで、xとyは正しい位置にあります!!

于 2012-05-22T09:54:03.590 に答える