Как отменить последовательность событий UITouch? - PullRequest
20 голосов
/ 10 февраля 2009

У меня есть UIImage представление, которое реагирует на сенсорные события. Я хочу отменить последовательность касаний, то есть дальнейшие вызовы touchesMoved:, если касание выходит за определенные границы. Как я могу это сделать?

Я знаю, что в touchesMoved: я могу проверять координаты сенсорного объекта и игнорировать его, но я не знаю, как вообще отменить последовательность. Я не вижу методов, описанных в Apple Developer UIResponder Reference , которые я могу вызвать, чтобы отменить последовательность касаний.

Ответы [ 12 ]

6 голосов
/ 10 февраля 2009

Это решение может быть немного глупым, но вы могли бы реализовать и вручную вызвать

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Я свободно основываю это решение на некоторой настройке, которую я сделал для примера приложения MoveMe на образце Apple iPhone , где я изменил метод touchesMoved, чтобы он выглядел следующим образом:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
3 голосов
/ 28 ноября 2011

Попробуйте временно установить для свойства userInteractionEnabled UIImageView значение NO

3 голосов
/ 13 мая 2010

Вам нужно позвонить [super touchesMoved:withEvent:], чтобы супер-просмотр очистился от события, но что более важно, вам нужно , а не , позвонить [super touchesCancelled:withEvent:].

Вот что я использовал для ячейки, чтобы она не была выделена при обнаружении удара:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) {
            RESPOND_TO_SWIPE
            showingEdit = YES;
            [super touchesCancelled:touches withEvent:event];
        } else {
            [super touchesMoved:touches withEvent:event];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        [super touchesEnded:touches withEvent:event];
    }
}
2 голосов
/ 21 ноября 2011

Я не думаю, что это возможно, потому что я не вижу его документированным, и ни одно из этих решений не работает.

2 голосов
/ 05 апреля 2010

Я недавно столкнулся с той же проблемой и нашел стандартный способ ее решения. Вы можете использовать [[UIApplication sharedApplication] beginIgnoringInteractionEvents], чтобы прекратить доставку событий touchesMoved для всего приложения. Обязательно включите их, используя [[UIApplication sharedApplication] endIgnoringInteractionEvents], когда вам нужно будет снова получать прикосновения.

1 голос
/ 03 августа 2016

Я достигаю этого, удаляя представление из его суперпредставления и добавляя его обратно.

[view retain];
UIView *sv = view.superview;
[view removeFromSuperview];
[sv addSubview:view];
[view release];

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

1 голос
/ 21 августа 2014

Этот код поможет вам. Я отключаю сенсорное событие в методе touchesMoved: и включаю сенсорное событие в touchesCancelled: методе

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
1 голос
/ 25 марта 2013

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

0 голосов
/ 17 апреля 2013

Вы можете создать категорию для UITouch. Вы можете объявить

@property (nonatomic,strong,readwrite) UIView *view;

А если вы, например, измените touch.view на nil, вы можете смоделировать окончание диспетчеризации событий касания

0 голосов
/ 13 января 2013

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

Наконец-то решил.

  1. Установить логический флаг с именем «отключен»
  2. В touchedMoved сначала убедитесь, что касание находится внутри желаемого вида. Если это не так, установите для флага отключения значение YES.
  3. По-прежнему в тронутом движении, проверьте флаг перед выполнением вашего действия. Так что на этом этапе ничего не произойдет, если они находятся вне поля зрения.
  4. В touchesEnded установите флаг отключения на NO. Таким образом, последовательность касаний эффективно останавливается, пока пользователь не поднимает палец.

Полагаю, это сработает для вас, если только у вас нет особой причины буквально отменить последовательность касаний.

...