UISystemGateGestureRecognizer и отложенные краны возле нижней части экрана
Каковы стандартные UISystemGestureGateGestureRecognizers
, установленные на верхнем уровне UIView
приложения iOS для?
Мое приложение состоит из двух видов - один заполняет верхнюю половину экрана, другой - пользовательскую клавиатуру и заполняет нижнюю половину. Я обнаружил, что краны на пробеле не всегда работают, и после некоторого исследования выяснилось, что время событий крана в нижних 20 пикселях или около того было иным, чем остальная часть обзора. Для большей части обзора период между касаниямиBegan/Ended составлял около 100 мс, где для пробела было 1-2 мс. (Мое приложение - эмулятор, и это слишком быстро, чтобы обнаружить нажатие клавиши).
После некоторого дополнительного копания я обнаружил, что основной UIView
приложения (т.е. мой основной просмотр view) имеет 2 UISystemGestureGateGestureRecognizer
. Удалив их в ViewDidAppear
, нижняя часть экрана больше не будет затронута. (Предположительно, это отмена событий сенсорного нажатия на мою клавиатуру, следовательно, более быстрое время).
Эти системные распознаватели присутствуют, по крайней мере, с iOS с 5 по 7 и на iPad и iPhone. Я думал, что они могут быть связаны с прокруткой сверху/снизу, но эта функциональность по-прежнему работает с ними.
Итак, у меня есть исправление, но я хотел бы больше узнать о том, что происходит здесь, в частности, что я могу сломать, удалив их.
Ответы
Ответ 1
Эти отсроченные касания беспокоили меня тоже.
Как дополнение к тому, что было сказано ранее,
здесь простое исправление:
override func viewDidAppear(_ animated: Bool) {
let window = view.window!
let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer
let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer
gr0.delaysTouchesBegan = false
gr1.delaysTouchesBegan = false
}
нет необходимости удалять эти распознаватели жестов.
просто добавьте это в основной контроллер представления.
Ответ 2
Похоже, что эти распознаватели предназначены для предотвращения случайных касаний вблизи верхней и нижней части экрана. Они не настроены с любыми целями, но могут (как и любой UIResponder
) поглощать прикосновения, чтобы предотвратить их передачу в цепочку ответчиков.
Заметки (проверены на iOS 7.1):
- Оба распознавателя жестов всегда присутствуют в окне ключа.
- я проверял оба жестка
_targets
ivar и обнаружил, что они вообще не настроены ни с какими целями. Выбрали addTarget:action:
, чтобы убедиться, что цели не были добавлены или удалены "на лету".
-
delegate
всегда nil
для обоих экземпляров.
- Если вы отключите распознаватели жестов, они снова включится.
- Жест, что это не задерживает контент, касается огней, когда вы перетаскиваете снизу или перетаскиваете сверху. Я не мог вызвать экземпляр, который задерживает касания.