我怎样才能像谷歌地图一样缩放



im正在开发一款带有某些游戏字段的游戏,该字段是在某些视图中绘制的。我的比赛场地总是相对于他的中心绘制,所以我只有简单的捏

- (void)pinch:(UIPinchGestureRecognizer *)gesture
{
if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {
    self.gameBoardGridView.scale *= gesture.scale; // adjust our scale
    gesture.scale = 1;  
}

和平移

-(void)pan:(UIPanGestureRecognizer *)recognizer
{
CGPoint translatedPoint = [recognizer translationInView:self.gameBoardGridView];

self.gameBoardGridView.gridCenter = CGPointMake(self.gameBoardGridView.gridCenter.x + translatedPoint.x, self.gameBoardGridView.gridCenter.y + translatedPoint.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.gameBoardGridView];
}

但我需要其他类型的缩放。当你放下两根手指,然后移动其中一根手指时,场会像它应该的那样展开(放大),但手指下的像素不再在手指下。图像从图像的中心缩放,而不是从两根手指之间的中点缩放。

我试了很多例子,但没有一个能像我想要的那样奏效。最后我写了这篇文章,它几乎是正确的,但不是完全的

- (void)pinch:(UIPinchGestureRecognizer *)gesture
{
CGFloat curScale = gesture.scale;
static CGPoint startPoint;
if (gesture.state == UIGestureRecognizerStateBegan) {
    startPoint = [gesture locationInView:self.gameBoardGridView];
}

if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {
    self.gameBoardGridView.scale *= gesture.scale;
    CGFloat widthDelta = self.gameBoardGridView.gridWidth * fabs(gesture.scale - 1) / 3;
    CGFloat heightDelta = self.gameBoardGridView.gridHeight * fabs(gesture.scale - 1) / 3;

    gesture.scale = 1;
    CGPoint lastPoint = self.gameBoardGridView.gridCenter;
    const CGFloat epsilon = 5;
    CGFloat coef = 1.0;
    if(curScale < 1) {
        coef = -1.0;
    }
    if (startPoint.x + epsilon < self.view.frame.size.width / 2) {
            lastPoint.x += widthDelta*coef;
    }
    else if (startPoint.x - epsilon > self.view.frame.size.width / 2) {
            lastPoint.x -= widthDelta*coef;
    }
    if (startPoint.y + epsilon < self.view.frame.size.height / 2) {
            lastPoint.y += heightDelta*coef;
    }
    else if (startPoint.y - epsilon > self.view.frame.size.height / 2) {
            lastPoint.y -= heightDelta*coef;
    }

    self.gameBoardGridView.gridCenter = lastPoint;
}
}

也许还有其他方法可以做到这一点?

缩放的中心是图像的锚点。您要做的是将锚点更改为手指的中点、位置和位置。我自己没有尝试过,我在这里看到了一个完整的解决方案,也许它会帮助你-

https://github.com/robertblackwood/CCPanZoomController

您尝试过使用UIScrollView吗?我也做了类似的事情。我开始使用这个教程,然后我为我的应用程序添加了一些特定的代码。

http://www.raywenderlich.com/10518/how-to-use-uiscrollview-to-scroll-and-zoom-content

最新更新