ピンチインとピンチアウトに基づいて、コンテキスト上で図面をズームしようとしています。これは完全に機能していますが、常に原点(左上)からズームします。これは、他のアプリケーションで得られる素晴らしい効果をもたらさず、本当に迷惑です。古いズーム方法は次のとおりです。
- (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の間になる可能性があります。
はっきりさせたかどうかはわかりませんが、何か情報が必要な場合や何かわからない場合は、私に聞いてください。できるだけ早く返信します。前もって感謝します!