Прикосновения закругленные иногда не называются
Я реализовал следующие обработчики событий в моем UIView:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.multipleTouchEnabled = YES;
}
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSArray* touchObjects = [[event allTouches] allObjects];
for(int i=0; i<[touchObjects count]; i++)
{
touch = (UITouch*)[touchObjects objectAtIndex:i];
curPoint = [touch locationInView:self];
NSLog([NSString stringWithFormat:@"begin = %f,%f",curPoint.x,curPoint.y]);
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint curPoint;
for (UITouch *touch in touches)
{
curPoint = [touch locationInView:self];
NSLog([NSString stringWithFormat:@"ended = %f,%f",curPoint.x,curPoint.y]);
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//logging touches
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
//logging touches
}
Проблема в том, что я иногда не получаю события "touchesEnded" (или touchedCancelled). Я всегда получаю события "touchesBegan" и "touchedMoved".
Я использую эти методы, поэтому я уверен на 100%, что иногда не получаю ожидаемых событий "touchesEnded" (или touchesCancelled).
MultiTouch включен.
Кто-нибудь знает, почему это происходит? Чрезвычайно важно, чтобы я получал эти события, поскольку я использую эти события, чтобы удалить подпредставление (я).
Есть ли обходной путь для этого? Можно ли запросить представление (или окно) для текущих касаний?
3 ответа
Ты думал использовать - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
вместо?
Ваш touchesBegan:withEvent:
метод неверен. Это говорит это:
NSArray* touchObjects = [[event allTouches] allObjects];
Проблема в [event allTouches]
возвращает все касания, а не только касания в начальной фазе. Поэтому, когда первый палец коснется экрана, вы войдете один begin = %f,%f
сообщение. Затем, когда второй палец коснется экрана, вы войдете два begin = %f,%f
сообщения, одно из которых для прикосновения, которое вы видели раньше.
Ваш touchesEnded:withEvent:
метод правильно перечисляет только touches
аргумент, который содержит только касания в завершающей фазе. Таким образом, для касания двумя пальцами вы будете регистрировать три сообщения "начало", но только два "законченных" сообщения.
Я не знаю ни одного способа запросить текущие касания, кроме методов обработки касаний.
У меня такая же проблема, добавление делегата shouldBegin устраняет проблему
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer