使用夹点缩放但不使用转换方法

我正在尝试缩放上下文的基础上绘制的graphics。 这是完美的,但它会始终从原点放大(左上angular)。 这不能给你在其他应用程序中获得的好效果,而且真的很烦人。 旧的缩放方法如下所示:

- (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之间。

我不确定自己是否清楚,但如果您需要任何信息或不明白的地方,只要问我,我会尽快回复。 提前致谢!

我自己find了答案。 我需要放大我的情况的方式是从触摸点放大。 所以当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在正确的位置!