Почему UIViewController затрагиваетBegan, затрагиваетMoved & touchesEnded, только вызывается, когда начинается первое из двух касаний, перемещается или заканчивается?

У меня возникла проблема с обработкой нескольких касаний с помощью методов touchBegan/Moved/Ended UIViewController. Я также вижу такое же поведение в приложении cocos2d (используя ccTouchesBegan/Moved/Ended), поэтому я думаю, что этот вопрос может быть применен ко всем касаниям в iOS. Я поставил код, который я использую ниже, а затем результаты, которые я вижу.

Все методы реализованы в подклассе UIViewController.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Began");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Moved");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Ended");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

-(void)logTouchesFor:(UIEvent *)event
{
    int count = 1;

    for (UITouch *touch in event.allTouches)
    {
        CGPoint location = [touch locationInView: self.view];

        NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
        count++;
    }
}

Теперь для интересных результатов...

Single Touches работают как ожидаемые

Скажем, я коснулся экрана большим пальцем. Я вижу, что в окне вывода, которое касаетсяBegan, вызывается как ожидалось. Я передвигаю большой палец и прикасается к нему. Затем я поднимаю мой палец с экрана и нажимает "Enned". Все это, как и ожидалось, я включаю в вопрос в качестве контрольного примера - просто чтобы было ясно, что мой контроллер просмотра получает события касания, и я не пропустил vc.view.userInteractionEnabled = YES где угодно.

Второй прикосновение не вызывает TouchBegan, касается касанийMoved или touchEnded для вызова

Это самый интересный. Скажем, я прикоснусь к экрану большим пальцем (коснетсяBegan) и удерживает его на экране. Затем я касаюсь где-то еще на экране указательным пальцем, сохраняя большой палец в том же месте. TouchesBegan не вызывается. Затем скажем, что я перемещаю указательный палец, сохраняя мой палец абсолютно неподвижным (это может быть сложно, но это возможно). TouchesMoved не вызывается. Затем я снимаю указательный палец с экрана. TouchesEnded не вызывается. Наконец, я двигаю большим пальцем и прикосновением. Затем я поднимаю большой палец с экрана и нажимает "Enned".

Просто, чтобы быть ясным: я установил self.view.multipleTouchEnabled = YES в свой метод viewDidLoad.

Информация о втором касании доступна, при условии перемещения первого касания

На этот раз я делаю что-то очень похожее на пример, приведенный выше. Я касаюсь экрана большим пальцем, а затем указательным пальцем, сохраняя мой палец неподвижно. TouchesBegan вызывается, когда мой палец попадает на экран, но не мой указательный палец. Теперь я перемещаю большой палец, и прикосновенияМодущий вызывается. Не только это, но есть два касания в event.allTouches array (и да, второе касание - это то, на что я ожидал бы этого). Это означает, что система знает, что я коснулся экрана второй раз, но я не получаю уведомления с помощью методов обработки касания на моем контроллере представления.

Как я могу получать уведомления об изменениях во втором касании?

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

В случае, если это имеет значение, я использую iPhone 3GS с iOS 5.1.

Ответ 1

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

Было рассмотрено рассматриваемое представление, которое имело userInteractionEnabled == YES. Как только я установил это на NO, мой контроллер просмотра начал получать касанияBegan/Moved/Ended для каждого касания. Предположительно, второе касание было заявлено subview и не дошло до моего контроллера представления, но я понятия не имею, почему это произойдет только со вторым касанием, а не с первым.

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