Ответ 1
Вам нужно будет установить recognizer.cancelsTouchesInView = false
в Swift или recognizer.cancelsTouchesInView = NO;
в Objective-C
Я играю с признанием прикосновений в приложении 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:
также реализованы с той же логикой
Может ли кто-нибудь объяснить это поведение? Есть что-то, что мне не хватает?
Вам нужно будет установить recognizer.cancelsTouchesInView = false
в Swift или recognizer.cancelsTouchesInView = NO;
в Objective-C
Попробуйте удалить любые распознаватели жестов, которые у вас есть в этом представлении. Они могут вмешиваться в touchesEnded
.
Вы должны переопределить все методы касания, если вы не называете супер-реализацию. Таким образом, вы должны также реализовать touchesMoved:withEvent:
and touchesCancelled:withEvent:
methods. Реализации могут быть пустыми, но вы должны это сделать.
touchesBegan:withEvent:
Если вы переопределите этот метод без вызова супер (общий шаблон использования), вы также должны переопределить другие методы обработки событий касания, если только в качестве незавершенных (пустых) реализаций.
Основано на описании класса UIResponder
Попробуйте переопределить метод UIView
hitTest
:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return self;
}
Возможно, что когда вы поднимаете пальцы, они не распознаются как находящиеся в UIView
, поэтому touchesEnded
не вызывается.
У меня была такая же проблема и она была решена с помощью этого простого кода в конце концов:
NSInteger touchCount = 0;
for (UITouch *touch in touches) {
touchCount++;
if([[event allTouches]count] == touchCount){
// do what you have to do here
}
}
//Вы получите предупреждение здесь, но не заботитесь об этом
Надеюсь, это поможет!
У меня была такая же проблема, даже после определения всех четырех обработчиков touch. У меня также не было активных распознавателей.
Решение для меня состояло в том, чтобы просто включить мультитач-события на мой взгляд, например
self.multipleTouchEnabled = YES;
что волшебным образом решило проблему.
Обратите внимание, что я делал события с несколькими касаниями еще до этого, т.е. События для нескольких пальцев одновременно, но у меня был вышеупомянутый вопрос, что не все из них были закончены должным образом.
Надеюсь, что кто-то поможет! :)