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

голоса
20

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

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

Задан 10/02/2009 в 19:37
источник пользователем
На других языках...                            


12 ответов

голоса
6

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

- (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;
}
Ответил 10/02/2009 в 20:51
источник пользователем

голоса
3

Попробуйте временно установив userInteractionEnabled свойство UIImageView к NO

Ответил 28/11/2011 в 04:30
источник пользователем

голоса
3

Вам нужно позвонить [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];
    }
}
Ответил 13/05/2010 в 01:50
источник пользователем

голоса
2

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

Ответил 21/11/2011 в 05:23
источник пользователем

голоса
2

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

Ответил 05/04/2010 в 10:30
источник пользователем

голоса
1

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

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

Это нарушает Ответчик цепь к мнению поэтому все остальные штрихи не будут получены на представлении. Следующий сенсорный все равно будет получено в обычном режиме.

Ответил 03/08/2016 в 10:44
источник пользователем

голоса
1

Этот код поможет вам. Отключить сенсорное событие в 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];
}
Ответил 21/08/2014 в 11:31
источник пользователем

голоса
1

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

Ответил 24/03/2013 в 21:56
источник пользователем

голоса
0

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

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

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

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

Ответил 13/01/2013 в 15:41
источник пользователем

голоса
0

На iOS5, как представляется, частный метод в UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

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

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

- (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);
    }
}
Ответил 25/11/2011 в 19:44
источник пользователем

голоса
-1

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

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

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

Ответил 17/04/2013 в 20:43
источник пользователем

голоса
-2

Вы можете проверить , что расположение точки касания в CGRect (то есть. Точек в прямоугольнике вашего ImageView) или нет. Если они не в том , что 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];
     }
 }
Ответил 24/11/2011 в 06:44
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more