UITouch locationInView неверно время от времени на симуляторе - PullRequest
0 голосов
/ 05 апреля 2019

Я столкнулся с очень странной проблемой с UITouch.

Я работаю над игрой. Он использует OpenGL с GLKView (у меня есть будущие планы по переходу на Metal). Также бывает, что используется UIScrollView. Я использую это для генерации значений X для прокручивания частей игрового интерфейса.

Этот UIScrollView является только частью экрана, но его границы гарантированно будут полностью в пределах GLKView.

Когда оба вида получают вызовы UITouch (например, touchesBegain:withEvent)., Я ставлю их в очередь для последующей обработки. Во время дальнейшей обработки я генерирую координаты с locationInView. В этом случае используемое представление является GLKView. Я также использовал nil, но поведение такое же.

Код для этого ниже, где view является GLKView. Для тех, кто не знаком, я в основном использую C ++ ... отсюда auto.

    auto p = [touch locationInView:view];

Эта система работала хорошо в течение достаточно долгого времени. Однако было несколько редких случаев, когда координаты неверны. Не только неправильно, но также кажется, что в этом случае я получаю 2 события Touch Down и 2 Touch Up для каждого щелчка мыши.

Touch at 0.000000 375.000000 a0a08070 0 0
Touch at 331.500000 178.000000 a0a08070 0 0
Touch at 331.500000 178.000000 a0a08070 0 3
Touch at 0.000000 375.000000 a0a08070 0 3

Например вывод, такой как выше. Поплавки CGPoint от locationInView. Шестнадцатеричное значение можно игнорировать. Последние два значения - тип и фаза соответственно.

Эта координата 0.0, 375.0 всегда одинакова, независимо от того, где на экране я нажимаю. Внутренние числа (331,5 и 178) всегда меняются на соответствующие значения, когда я щелкаю по экрану.

Как только я нахожусь в этом режиме, конкретный симулятор ведет себя таким образом, пока я не сброслю его. Обратите внимание, что в этом случае GLKView получает события касания, а также UIScrollView, следовательно, 2 вызова. Я также определил, что правильные значения генерируются UIScrollView. Я не знаю, каков источник дополнительных событий касания для GLKView.

Я не вызываю super, когда обрабатываю события в UIScrollView. Я также пробовал звонить super и не звонить super. Он ведет себя так же.

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

Как уже говорилось, это довольно редкое событие. Например, в прошлом году я столкнулся с этим, может быть, 5 раз включительно этого времени. Для сегодняшнего события я не сбросил сим, поэтому он позволяет мне экспериментировать. Я знаю из прошлого опыта, это исправит условие.

Я также не видел, чтобы это произошло на устройстве.

...