iOS — игнорирование жеста касания

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

Так что это так же просто, как определить, когда сенсорный жест находится над одной из этих кнопок, и вернуть false, чтобы отменить этот конкретный жест, верно? Ну не для меня...

Я удалил логику и просто вернул НЕТ в распознаватель жестов, но я все еще не могу нажимать на кнопки.

- (BOOL)ignoreTap:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch
{
    return NO;
}

Есть ли что-то, что мне здесь не хватает?


person Nippysaurus    schedule 24.08.2011    source источник


Ответы (2)


Решение более простое: для этого не следует использовать распознаватель жестов. Если вы не хотите, чтобы ячейка была доступна для выбора, вы можете сделать две вещи:

  • вернуть nil из -tableView:willSelectRowAtIndexPath:, чтобы сделать его недоступным для выбора
  • установите ячейку selectionStyle to UITableViewCellSelectionStyleNone для удаления эффекта выделения

Это должно сохранить функциональность вашей кнопки.


Редактировать: если вы не хотите этого делать, то вы можете сделать то, что вы изначально пытались — за исключением того, что я думаю, что у вас неправильное имя метода, оно должно быть таким:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
person jtbandes    schedule 24.08.2011
comment
Я не хочу удалять возможность выбора ячейки. Пользователь по-прежнему может выбрать его другим жестом. - person Nippysaurus; 24.08.2011
comment
Вы абсолютно правы. В течение многих лет (для меня это была постоянная проблема) я думал, что люди говорили о действии для распознавателя жестов ... я не осознавал, что у него тоже может быть делегат и что сигнатуры методов были так похожи :) Спасибо, что нашли время ответить мне на этот вопрос :) - person Nippysaurus; 24.08.2011
comment
Да, это может немного сбивать с толку... у вас могут быть собственные имена методов для действия, но методы делегата всегда одни и те же! - person jtbandes; 24.08.2011

для этого я сделал такую ​​кнопку:

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self addTarget:self action:@selector(touchDown) forControlEvents:UIControlEventTouchDown];
    [self addTarget:self action:@selector(touchUpInside) forControlEvents:UIControlEventTouchUpInside];
    [self addTarget:self action:@selector(touchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
}

- (void)touchDown
{
    self.imageView.image = [UIImage imageNamed:@"ButtonPressed.png"];
}

- (void)touchUpInside
{
    self.imageView.image = [UIImage imageNamed:@"Button.png"];
}

- (void)touchUpOutside
{
    self.imageView.image = [UIImage imageNamed:@"Button.png"];
}

- (void)setHighlighted:(BOOL)highlighted
{
    return;
}
person Samuel    schedule 05.10.2012