6 разных UISwipeGestureRecognizer, всегда получают один и тот же - PullRequest
1 голос
/ 12 июля 2011

У меня есть TableView, содержащий UITableViewCells, каждая с 6 кнопками ...

UISwipeGestureRecognizer добавляется к каждой из кнопок следующим образом:

- (void)awakeFromNib {
    UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self
                                            action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_XXSButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_XSButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_SButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_MButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_LButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_XLButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    rightSwipe = [[UISwipeGestureRecognizer alloc]
                  initWithTarget:self
                  action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_XXLButton addGestureRecognizer:rightSwipe];
    [rightSwipe release];
}

- (void)handleRightSwipe:(UIGestureRecognizer *)gestureRecognizer {
    UIButton *button = (UIButton *)[gestureRecognizer view];
    [self zeroButton:button];
}

При распознавании пролистывания вызывается метод zeroButton.

Независимо от того, на какую кнопку я делаю пролистывание, полученное изображение имеет первую кнопку. Я бы ожидал, что [gestRecognizer view] вернет кнопку, на которой было выполнено перелистывание. Есть идеи, почему я всегда получаю жест только первой кнопки?

Я понимаю, что этот код не самый элегантный для начала, так как приходится создавать 6 различных UISwipeGestureRecognizer. Я бы предпочел создать жест на самом UITableViewCell и вручную проверить, возникла ли прокрутка над определенной кнопкой. К сожалению, моя попытка этого оказалась ненадежной. Так что, если у кого-то есть предложение о том, как реализовать этот метод, было бы еще лучше (Позже я опубликую это "решение")

Спасибо ...

Ответы [ 2 ]

1 голос
/ 14 июля 2011

На самом деле, это была ошибка в коде zeroButton, из-за которой он всегда сбрасывал первую кнопку.Я использовал тег, назначенный кнопке, чтобы определить, какое действие создать.Мои теги были неправильно установлены!дурак я.Таким образом, код в моем исходном вопросе был на самом деле правильным.

Так как я изменил код следующим образом:

- (void)awakeFromNib {
    UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self
                                            action:@selector(handleRightSwipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
    rightSwipe.delegate = self;

    [self addGestureRecognizer:rightSwipe];
    [rightSwipe release];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIButton class]])
    {
        // only recognises gesture started on a button
        return YES;
    }
    return NO;
}

- (void)handleRightSwipe:(UIGestureRecognizer *)gestureRecognizer {
    // Determine which button received the right swipe

    // Get the position of the point tapped in the UIViewCell co-ordinate system
    CGPoint tapPoint = [gestureRecognizer locationInView:self];
    NSLog(@"%.1f %.1f", tapPoint.x , tapPoint.y);
    UIView *viewAtBottomOfHierarchy = [self hitTest:tapPoint withEvent:nil];
    if ([viewAtBottomOfHierarchy isKindOfClass:[UIButton class]])
    {
        [self zeroButton:(UIButton *)viewAtBottomOfHierarchy];
    }
}

Это смотрит на то, откуда произошел удар, и определите, с какой кнопки он начал (если есть) ...

1 голос
/ 12 июля 2011

Один альтернативный подход, так как вы используете UIButton s будет использовать addTarget:action:forControlEvents: на ваших кнопках для событий:

UIControlEventTouchDragInside 
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter  
UIControlEventTouchDragExit  

и выполняйте обработку в указанном вами методе action. Не должно быть трудным «отобразить» ветви в вашем методе обработки жестов на различные методы (или только один метод, если вам нравится) внутри вашего класса.

Я понимаю, что это не совсем удовлетворительный ответ, так как он отказывается от использования распознавателей жестов (и их средств), но он может работать для вас.

Что касается того, почему распознаватель жестов не работает правильно при применении к UITableViewCell (и, возможно, это также объясняет, почему только первая кнопка, кажется, получает жест), поведение, которое вы описали в своем комментарии, напомнило мне, что UIScrollView (базовый класс UITableView) жаден касаниями (хотя и не так сильно, как UIWebView), и это наверняка влияет на то, как касания перенаправляются. Итак, я не знаю, работает ли это, но я нашел это в UIScrollView:

delaysContentTouches

Если значением этого свойства является ДА, представление прокрутки задерживает обработку жеста касания до тех пор, пока не сможет определить, является ли целью прокрутка. Если значение равно NO, представление прокрутки немедленно вызывает touchesShouldBegin: withEvent: inContentView :. Значением по умолчанию является ДА.

Это может сработать или нет, даже UITableView может вообще не работать, но его легко попробовать.

Если это не сработает, а моя предыдущая гипотеза все еще верна, можно обойти это подклассом UITableView и переопределить методы, связанные с касанием (например, touchesShouldBegin:withEvent:inContentView:), чтобы вы могли настроить их поведение.

СТАРЫЙ и НЕПРАВИЛЬНЫЙ ОТВЕТ:

Насколько я понимаю, вы можете использовать один и тот же распознаватель жестов для разных представлений, например:

rightSwipe = [[UISwipeGestureRecognizer alloc]
              initWithTarget:self
              action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_LButton addGestureRecognizer:rightSwipe];
[_SButton addGestureRecognizer:rightSwipe];
[_XButton addGestureRecognizer:rightSwipe];
[rightSwipe release];

Я не знаю, может ли это решить вашу проблему, поскольку в вашем случае происходит следующее: независимо от того, какую кнопку вы проводите, всегда активируется первый распознаватель жестов, и это довольно сложно объяснить, поскольку вы есть разные кнопки. Это может быть связано с некоторым перекрытием (я предполагаю) между кнопками или с тем фактом, что все ваши кнопки «встроены» в ячейку таблицы, поэтому механизм смахивания на уровне ячейки мешает механизму смахивания на уровень подэлемента, но я не уверен в этом.

В качестве альтернативного подхода, который, безусловно, работает, вы можете прикрепить свой распознаватель жестов к самой ячейке таблицы (вы упомянули о своей попытке присоединить его к самому представлению таблицы; будет работать присоединение к ячейке таблицы).

Надеюсь, это поможет.

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