Заключенные не были вызваны

Я играю с признанием прикосновений в приложении iOS, и у меня есть этот простой код

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"%lu",(unsigned long)[touches count]);
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
     UITouch *touch = obj;
     CGPoint touchLocation = [touch locationInNode:self.scene];
     NSLog(@"B x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    UITouch *touch = obj;
    CGPoint touchLocation = [touch locationInNode:self.scene];
    NSLog(@"E x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

ПрикосновенияBegan называют штрафом, если я помещаю от одного пальца до 5 пальцев на экране одновременно, я вижу, что его вызывают с правильной информацией

То же самое не происходит с touchesBegan, много раз, если у меня есть 3 пальца на экране и удалять их одновременно, я вижу только информацию о 2 касаниях, заканчивающихся (а иногда и 1). Если я вынимаю пальцы по одному за раз, метод также обычно вызывается 2 раза (иногда 1, хотя редко его можно будет назвать правильным 3 раза). По мере увеличения количества касаний также вероятный капюшон некоторой информации, не являющейся показано в методе touchesEnded

Способы touchesMoved:withEvent: and touchesCancelled:withEvent: также реализованы с той же логикой

Может ли кто-нибудь объяснить это поведение? Есть что-то, что мне не хватает?

Ответ 1

Вам нужно будет установить recognizer.cancelsTouchesInView = false в Swift или recognizer.cancelsTouchesInView = NO; в Objective-C

Ответ 2

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

Ответ 3

Вы должны переопределить все методы касания, если вы не называете супер-реализацию. Таким образом, вы должны также реализовать touchesMoved:withEvent: and touchesCancelled:withEvent: methods. Реализации могут быть пустыми, но вы должны это сделать.

touchesBegan:withEvent:

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

Основано на описании класса UIResponder

Ответ 4

Попробуйте переопределить метод UIView hitTest:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
   return self;
}

Возможно, что когда вы поднимаете пальцы, они не распознаются как находящиеся в UIView, поэтому touchesEnded не вызывается.

Ответ 5

У меня была такая же проблема и она была решена с помощью этого простого кода в конце концов:

NSInteger touchCount = 0;
for (UITouch *touch in touches) {
   touchCount++;
    if([[event allTouches]count] == touchCount){
       // do what you have to do here
    }
}

//Вы получите предупреждение здесь, но не заботитесь об этом

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

Ответ 6

У меня была такая же проблема, даже после определения всех четырех обработчиков touch. У меня также не было активных распознавателей.

Решение для меня состояло в том, чтобы просто включить мультитач-события на мой взгляд, например

self.multipleTouchEnabled = YES;

что волшебным образом решило проблему.

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

Надеюсь, что кто-то поможет! :)