Вопрос по ios, touch, cocoa-touch – Почему UIViewController трогает Beg, touchesMoved & touchchesEnded вызывается только тогда, когда первое из двух касаний начинается, двигается или заканчивается

10

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

у тебя естьexclusiveTouch = YESгде-то в вашем представлении иерархии? Это, кажется, происходит для меня, когда первое касание находится в подпредставлении представления сexclusiveTouch = YES Jörn Eyrich
может быть, я слишком поздно, но вы заметили, что в каждом методе вызываемый супер одинаковый: touchesEnded advantej
Я не устанавливаю его где-либо в коде, но я использую раскадровки - могли бы они его где-нибудь установить? Есть ли другое свойство, которое может иметь аналогичный эффект? Этот контроллер представления находится на глубине нескольких поколений в иерархии представлений, поэтому одно из его суперпредставлений может делать то, чего я не ожидаю. rankAmateur

Ваш Ответ

1   ответ
11

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

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

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

Возможно ли, что ваше подпредставление имело несколько соединений TouchTeNabled == НЕТ?
Вы вызываете супер-метод touchesEnd в своем собственном методе touchesBegan. Вы должны позвонить супер прикосновения Began. (и наоборот для касаний)
Да, это так, но я все еще не понимаю, почему потребовалось второе касание, а не первое. rankAmateur

Похожие вопросы