Как ограничить касания Начать и прикосновения Закруглить только одним касанием? - PullRequest
0 голосов
/ 22 марта 2012

У меня есть представление с двумя подпредставлениями:

  1. A UIImageView
  2. Небольшое пользовательское представление, похожее на часы с стрелками, которые можно вращать.

Я написал код для поворота рук в прикосновениях Began и touchesMoved из пользовательского вида, похожего на часы.

Этот пользовательский вид размещен над изображением, и я добавил масштабирование двумя пальцами, поворот, панорамированиек изображению.

Теперь моя проблема в том, что когда я касаюсь одного из моих двух пальцев руками этого вида с часами, они двигаются и поворачивают, чего я не хочу.

Я хочу ограничить их прикосновениятолько когда я делаю жест одним пальцем на них, а не жест двумя пальцами на изображении позади него.

РЕДАКТИРОВАТЬ: Вот мой код для добавления жеста

UIPanGestureRecognizer *panGesture = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)] autorelease];
panGesture.maximumNumberOfTouches = 2;
panGesture.minimumNumberOfTouches = 2;
[self.imageView addGestureRecognizer:panGesture];

1 Ответ

1 голос
/ 22 марта 2012

Метод -(NSUInteger)numberOfTouches из UIGestureRecognizer может сказать, сколько касаний размещено на вашем виде.Также это Руководство по обработке событий может помочь вам:)

Другой путь - это UITapGestureRecognizer, который можно настроить с помощью numberOfTouchesRequired для ограничения одногораспознаватель на специальное количество пальцев.

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

Я предлагаю вам использовать частную BOOL, которая блокирует взаимодействие с одним из распознавателей жестов, если другой активен.

С новым компилятором LLVM, доступным в XCode 4 и более поздних версиях, вы можете объявить переменные @private в категориях по умолчанию в файле вашей реализации (.m):

@interface YourClassName() {
  @private:
    BOOL interactionLockedByPanRecognizer;
    BOOL interactionLockedByGestureRecognizer;
}
@end

@implementation YourClassName
  ... your code ...
@end

Ваш метод, обрабатывающийВзаимодействие с панорамированием (я предполагаю, что в конце вы будете делать какую-то анимацию для перемещения по вещам):

- (void)handlePan:(id)sender
{
  if (interactionLockedByGestureRecognizer) return;

  interactionLockedByPanRecognizer = YES;
  ... your code ...
  [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                 animations:^{
                   [[sender view] setCenter:CGPointMake(finalX, finalY)];
                 } 
                 completion:^( BOOL finished ) {
                   interactionLockedByPanRecognizer = NO;
                 }
 ];
}

Теперь вам просто нужно проверить внутри ваших touchesBegan, touchesMoved и touchesEndedесли взаимодействия заблокированы UIPanGestureRecognizer:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  interactionLockedByGestureRecognizer = YES;
  ... your code ...
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  ... your code ...
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  ... your code ...
  interactionLockedByGestureRecognizer = NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...