Понимание взаимодействий CGAffineTransform

#objective-c #ios #cocoa-touch #cgaffinetransform

#objective-c #iOS #cocoa-touch #cgaffinetransform

Вопрос:

Я пытаюсь создать простое приложение, в котором изображение, которое «закреплено» ge, возвращается в свое положение после перемещения пальцем. Вероятно, это лучше объясняется с помощью кода:

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     image.transform = CGAffineTransformIdentity;
}


- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    if (CGRectContainsPoint([image frame], [touch locationInView:nil])) 
    {
         image.center = [touch locationInView:nil];
    }
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
     if (pin) {
         CGPoint point = image.center;
         CGPoint center = self.view.center;
         //CGAffineTransform transform = CGAffineTransformMakeTranslation(0, 0);
         [UIView beginAnimations:nil context:NULL];
         [UIView setAnimationDuration:0.5];
         image.transform = CGAffineTransformMakeTranslation(center.x - point.x, center.y - point.y);
         //image.transform = CGAffineTransformConcat(image.transform, CGAffineTransformMakeTranslation(center.x - point.x, center.y - point.y));
    [UIView commitAnimations];

    }
}
 

Каждый раз, когда я нажимаю на изображение, оно смещается так, что оно выходит из-под моего пальца. Я думаю, что это как-то связано с преобразованиями. Может ли кто-нибудь указать мне правильное направление?

Ответ №1:

Я думаю, вам следует просто использовать

 image.transform = CGAffineTransformMakeTranslation(difference.x, difference.y);
 

То, как вы это делаете, вы накапливаете все больше и больше переводов с каждой итерацией touchesMoved. Я думаю, что свойство center не зависит от преобразования.

Комментарии:

1. Я объединил методы из двух разных источников: P. Спасибо!

Ответ №2:

ОТРЕДАКТИРОВАНО

На САМОМ деле я бы сделал это так:

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
}


- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint location = [[touches anyObject] locationInView:[touch view]];
    CGPoint difference = CGPointMake(location.x - image.center.x, location.y - image.center.y);

    image.transform = CGAffineTransformTranslate(image.transform, difference.x, difference.y);
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (pin) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        image.transform = CGAffineTransformIdentity;
        [UIView commitAnimations];
    }
}
 

Комментарии:

1. Отлично сработало! Хотя мне действительно нужно было добавить UITouch *touch = [[событие allTouches] AnyObject]; для того, чтобы код работал (также мне нужно было проверить границы). Спасибо!