2013-07-02 7 views
3

im разработка игры с некоторым игровым полем, которое нарисовано в некотором представлении. Моя игра поле всегда рисунок относительно его центра, так что я просто в крайнем случаекак я могу сделать масштабирование, как в google maps

- (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; 
} 
} 

Может быть, есть другие способы сделать это?

ответ

0

Центр масштабирования - точка привязки изображения. Что вам нужно сделать, это изменить опорную точку на среднюю точку пальцев, местоположение и положение. Не пробовал себя купить, я увидел полное решение здесь, может быть, это поможет вам -

https://github.com/robertblackwood/CCPanZoomController

 Смежные вопросы

  • Нет связанных вопросов^_^