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;
}
}
Может быть, есть другие способы сделать это?