Почему UIViewController трогает Beg, touchesMoved & touchchesEnded вызывается только тогда, когда первое из двух касаний начинается, двигается или заканчивается
У меня проблема с обработкой более одного касания с помощью методов touchesBegan / 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 Work as Expected
Допустим, я касаюсь экрана большим пальцем. Я вижу в окне вывода, что touchBegan был вызван, как и ожидалось. Я двигаю большим пальцем, и меня трогают. Затем я убираю большой палец с экрана и прикасаюсь к закругленному вызову. Все это, как и ожидалось, я включил в вопрос в качестве контрольного случая - просто чтобы было ясно, что мой контроллер представления получает события касания, и я не пропустилvc.view.userInteractionEnabled = YES
в любом месте.
The Second Touch Doesn't Cause touchesBegan, touchesMoved or touchesEnded to be called
Это самый интересный. Допустим, я касаюсь экрана большим пальцем (называется touchsBegan) и держу его неподвижно на экране. Затем я касаюсь где-то еще на экране указательным пальцем, удерживая большой палец на том же месте. Прикосновения Бегана не называются. Затем, скажем, я двигаю указательным пальцем, сохраняя при этом большой палец абсолютно неподвижным (это может быть сложно, но возможно). TouchesMoved не называется. Затем я убираю указательный палец с экрана. TouchesEnded не называется. Наконец, я двигаю большим пальцем, и происходит касание Moved. Затем я убираю большой палец с экрана и прикасаюсь к закруглению.
Просто чтобы быть ясно: я установилself.view.multipleTouchEnabled = YES
в моемviewDidLoad
метод.
Information About the Second Touch is Available, Providing the First Touch Moves
На этот раз я делаю что-то очень похожее на пример, приведенный выше. Я касаюсь экрана большим пальцем, затем указательным пальцем, сохраняя при этом большой палец. TouchesBegan вызывается, когда мой большой палец касается экрана, но не мой указательный палец. Теперь я двигаю большим пальцем, и touchsMoved называется. Мало того, но есть два касания в массиве event.allTouches (и да, второе касание - то, где я ожидал бы, что это будет). Это означает, что система знает, что я коснулся экрана во второй раз, но я не получаю уведомления о методах обработки касаний на моем контроллере представления.
How Can I be Notified About Changes to the Second Touch?
Я действительно хотел бы иметь возможность реагировать на изменения местоположения или состояния второго касания по мере их возникновения, а не когда первое касание также изменяется. Большую часть времени это не будет проблемой, потому что очень трудно изменить одно касание, не влияя на другое, но у меня есть по крайней мере одна ситуация, когда это может быть проблемой. Я что-то упускаю из виду? Кто-нибудь еще заметил это поведение или были проблемы с ним?
В случае, если это уместно, я использую iPhone 3GS под управлением iOS 5.1.