gpt4 book ai didi

objective-c - 使用捏合缩放但不使用变换方法

转载 作者:行者123 更新时间:2023-11-28 17:33:30 24 4
gpt4 key购买 nike

我正在尝试基于捏合和捏合来缩放上下文中的绘图。这工作得很好,但它总是从原点(左上角)开始缩放。这不会产生您在其他应用程序中获得的良好效果,而且真的很烦人。老的缩放方法如下:

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

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

最佳答案

我自己找到了答案。在我的案例中需要放大的方法是从触摸点开始放大。因此,当 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 位于正确的位置!!

关于objective-c - 使用捏合缩放但不使用变换方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10532113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com