У меня возникла проблема с обработкой нескольких касаний с помощью методов 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.