2012-05-10 3 views
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となります。

私は自分自身を明確にしているかどうかはわかりませんが、情報が必要な場合や何かを理解していない場合は尋ねます私と私はできるだけ早く返信しようとします。前もって感謝します!

+0

スクロールビューズームだけでなく、ジェスチャーを使用する理由はありますか? – Jaybit

+0

スクロールビューはありません。描画はビュー(CGContextRef)に描画されます。 – Manuel

+0

ビューをズームしているとき(私が読んでいるもの)、または接触しているポイント(ズームしたときにあなたが付けたコードに何が入っているか)に問題がありますか? –

答えて

0

私は自分自身で答えを見つけました。私の場合、ズームインする必要があるのは、タッチの点からズームすることです。だから、xとy座標は、これを行うズームを取得する場合:

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

x *= zoomLevel; 
y *= zoomLevel; 

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

または短い中:今、xとyは正しい場所にいる

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

を!

関連する問題