Когда прикасается к вам?

Когда вы перетаскиваете палец по сенсорному экрану iPhone, он генерирует события touchesMoved с хорошим регулярным 60 Гц.

Однако переход от начального события touchesBegan к первому touchesMoved менее очевиден: иногда устройство ждет некоторое время.

Чего ждет? Большие дельта времени/расстояния? Больше прикосновений к участию в мероприятии?

Кто-нибудь знает?

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

Чтобы увидеть эту ошибку/явление в действии

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

  • попробуйте "ползти" по узкому мосту в любом количестве 3D-игр. Срыв!

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

Должен был зарегистрировать это как ошибку 8 месяцев назад.

Ответы

Ответ 1

После того, как событие touchsBegan запущено, UIKit ищет позиционное движение касания пальца, которое преобразуется в коснутые события, когда x/y пальца изменяется до тех пор, пока палец не будет поднят, и не коснется событие touchesEnded.

Если палец удерживается в одном месте, он не срабатывает прикосновенияМодульное событие, пока не будет движение.

Я создаю приложение, в котором вам нужно рисовать на основе touchphonesMoved, и это происходит с интервалами, но оно достаточно быстро, чтобы обеспечить гладкий внешний вид чертежа. Поскольку это событие и захоронено в SDK, вам может потребоваться провести некоторое тестирование в вашем сценарии, чтобы узнать, как быстро он реагирует, в зависимости от других действий или событий он может быть переменным для ситуации, в которой он используется. По моему опыту он находится в пределах нескольких миллисекунд движения, и это примерно с 2-3k других спрайтов на экране.

Рисунок начинается с события touchsBegan, поэтому, когда установлено первое место, он привязывается к touhesMoved и заканчивается с помощью touchs.End. Я использую все события для операции перетаскивания, поэтому, возможно, первоначальный ход в этом случае менее лаконичен.

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

http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/touchesMoved:withEvent:

Ответ 2

Я не думаю, что это ошибка, это скорее недостающая функция.

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

Это ничего нового, он всегда был там, например, есть несколько пикселей толерантности к двойным щелчкам в графических интерфейсах на основе указателей - или даже этот же допуск до начала перетаскивания, поскольку пользователи иногда непреднамеренно перетаскивают, когда они просто предназначенный для щелчка. Попробуйте медленно перемещать элемент на рабочем столе (OSX или Windows), чтобы увидеть его.

Отсутствующая функция состоит в том, что она не может быть конфигурируемой.

Идея: возможно ли ввести временной цикл на touchesBegan, который периодически проверяет на ощупь locationInView:?

Ответ 3

Я не представляю никакого официального ответа, но имеет смысл, что touchsBegan- > touchesMoved имеет более длительную продолжительность, чем touchMoved- > touchhesMoved. Это было бы разочаровывающим для разработчиков, если бы каждый штрихBegan сопровождался кучей случайных касаний. Apple, должно быть, определила (экспериментально) некоторое расстояние, на которое прикосновение становится перетаскиванием. После того, как начался touchsMoved, нет необходимости выполнять этот тест больше, потому что каждая точка до следующего касанияUp гарантированно будет касатьсяМонировано.

Кажется, это то, что вы говорите в своем оригинальном посте, Rythmic Fistman, и я просто хотел немного подробнее рассказать и сказать, что согласен с вашими рассуждениями. Это означает, что если вы рассчитываете какую-то "скорость перетаскивания", вам необходимо использовать пройденное расстояние как фактор, а не в зависимости от частоты таймера обновления (это все равно лучше).

Ответ 4

Ожидание первого хода. Это то, как ОС отличает сопротивление от крана. После перетаскивания все новые уведомления касаютсяMoved.

Это также является причиной того, что вы должны писать код для выполнения при событии соприкосновения.

Ответ 5

В настоящее время такая "задержка" между касаниямиBegan и touchsMoved присутствует, когда другие пальцы касаются экрана. К сожалению, кажется, что опция отключить его пока не существует. Я также разработчик музыкальных приложений (и плеер), и я нахожу это поведение очень раздражающим.