Прикосновения закругленные иногда не называются

Я реализовал следующие обработчики событий в моем 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
Другие вопросы по тегам