Я создаю приложение для iPhone. У меня есть UIView, который содержит набор объектов подкласса UIImageView. Пользователь может перетаскивать и поворачивать изображения с помощью касания. У меня возникают проблемы при перемещении изображения после его поворота.
Чтобы повернуть изображение, я применяю вращение преобразования, которое работает отлично. Это выглядит так:
CGAffineTransform trans = self.transform;
self.transform = CGAffineTransformRotate(trans, delta);
Проблема возникает позже, когда пользователь пытается переместить элемент касанием. В touchesBegan: WithEvent :, я сохраняю начальную точку в переменной класса, startLocation:
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
// Retrieve the touch point
CGPoint pt = [[touches anyObject] locationInView:self];
startLocation = pt;
}
В touchesMoved: withEvent :, у меня был следующий код, который работает достаточно хорошо, если в представлении изображения нет преобразования вращения:
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
self.center = newCenter;
}
Но если при просмотре изображения происходит преобразование поворота, то при каждом событии touchSMoved оно отображается по экрану и вскоре исчезает. В отладчике я заметил, что значение pt стало чудовищным. Мне пришло в голову, что мне нужно преобразовать эту точку, что я и сделал, вот так:
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
if (!CGAffineTransformIsIdentity(self.transform)) {
pt = CGPointApplyAffineTransform(pt, self.transform);
}
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
}
Это сработало намного лучше. Теперь я могу перетащить изображение вокруг экрана. Но самое первое движение заставляет изображение трястись один раз в том или ином направлении, в зависимости от угла поворота в преобразовании и размеров изображения.
Как я могу переместить изображение без начального толчка?
Почему мне не нужно преобразовывать startLocation (точку, которую я фиксирую, когда начинается касание)?