Как я могу преобразовать координаты события касания в подпредставлении в координаты в его родительском представлении? - PullRequest
3 голосов
/ 31 октября 2010

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

В настоящее время у меня есть события touchesBegan и touchesMoved, реализованные в классе UIPuzzlePiece ...

// Handles the start of a touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = [[event touchesForView:self] anyObject];
  CGPoint cgLocation = [touch locationInView:self];
  [self setCenter:cgLocation];
}

// Handles the continuation of a touch.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
  UITouch *touch = [[event touchesForView:self] anyObject];
  CGPoint cgLocation = [touch locationInView:self];
  [self setCenter:cgLocation];
}

Проблема, с которой я сталкиваюсь, заключается в том, что возвращаемое местоположение CGPoint представляет местоположение в представлении UIPuzzlePiece, что имеет смысл, но мне нужно знать местоположение касания внутри родительского представления. Таким образом, оператор [self setCenter:cgLocation] фактически переместит UIPuzzlePiece в место касания. Я всегда могу написать какой-нибудь хакерский алгоритм для его преобразования, но я надеялся, что есть лучший или более простой способ достижения моей цели. Если бы у меня была только одна часть головоломки, я бы просто реализовал код сенсорного события в контроллере представления родительского представления, но у меня есть много частей головоломки, поэтому я обрабатываю его в представлении UIPuzzlePiece.

Ваши мысли? Большое спасибо за вашу мудрость!

1 Ответ

4 голосов
/ 31 октября 2010

UIView реализует -convertRect:fromView:, -convertRect:toView:, -convertPoint:fromView: и -convertPoint:toView:. Похоже, вам просто нужно использовать один из последних методов для преобразования между координатными пространствами вида. Например, если вы хотите преобразовать CGPoint из координатного пространства self в родительское представление, вы можете использовать либо [self convertPoint:thePoint toView:self.superview], либо вы можете использовать [self.superview convertPoint:thePoint fromView:self] (они будут делать то же самое).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...