Подтвердить что ты не робот

Как отменить последовательность событий UITouch?

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

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

4b9b3361

Ответ 1

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

- (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;
}

Ответ 2

Вам нужно позвонить [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];
    }
}

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

Этот код поможет вам. Я отключу событие касания в методе 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];
}

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

В iOS5, похоже, есть частный метод в UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

В зависимости от реализации apple он может прекратить отправку событий

Другой способ сделать это - использовать ассоциативные объекты

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue])
        return;
    if (sometouchisoutsideofview) {
        objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN);
    }
}

Ответ 10

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

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

  • Настройте булевский флаг с именем "disabled"
  • Прикосновенный, сначала проверьте, что прикосновение находится внутри желаемого вида. Если это не так, установите для отключенного флага значение YES.
  • Все еще находясь в touchedMoved, перед выполнением действия отметьте флаг. Таким образом, на данный момент ничего не произойдет, если они находятся вне представления.
  • Прикосновением, установите для отключенного флага значение НЕТ. Таким образом, сенсорная последовательность эффективно останавливается, пока пользователь не поднимет свой палец.

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

Ответ 11

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

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

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

Ответ 12

Вы можете проверить, что местоположения точек касания находятся в CGRect (т.е. точки находятся в прямоугольнике вашего изображения) или нет. Если они не находятся в этом Rect, прикосновение будет отменено.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(myImageView, touchLocation))
    {
       lastPoint = [touch locationInView: myImageView];
    }

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y);   
  }

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
 {
  CGPoint currentPoint;
  UITouch *touch = [touches anyObject];
  CGPoint touchLocation = [touch locationInView:self.view];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
       currentPoint = [touch locationInView: myImageView];
     }
 }