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 для обоих экземпляров.
  • Если вы отключите распознаватели жестов, они снова включится.
  • Жест, что это не задерживает контент, касается огней, когда вы перетаскиваете снизу или перетаскиваете сверху. Я не мог вызвать экземпляр, который задерживает касания.