2016-12-12 2 views
1

Я знаю, что события прикосновений могут доставляться до хита или жеста. но что-то смутило меня в моей демонстрации:Как работает UIGestureRecognizer с цепочкой UIResponder?

У меня есть два подзаголовка в моем корневом представлении, один из них - testView (подкласс UIView), другой - testBtn (UIButton), действие которого «testBtnClicked». Затем я добавляю UITapGestureRecognizer в свой корневой режим и устанавливаю его действие на «tapAction».

Проблема возникает:

, когда я затрагиваю корневой точки зрения, это вызовет "touchsBegan: withEvent:", "tapAction" и "touchsCancelled: withEvent" метод. Это то, чего я ожидал;

Когда я касаюсь testView, он работает так же, как и выше;

, когда я касаюсь testBtn, это только вызвало метод «testBtnClicked». Почему?

Почему жест распознается, когда я касаюсь testView не корневым представлением? и почему он не распознается, когда я касаюсь testBtn?

ответ

4

Aha! Может быть, я получил ответ:

Во-первых, gestureRecognizers получить первую возможность распознавать прикосновение, как App Док говорит:

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

Во-вторых, в прошивкой 6.0 и более поздних UIButton действия предотвратить перекрывающихся поведение жест распознавателя, также, как Apple, Док говорит:

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

  • одним пальцем одним нажатием на UIButton, UISwitch, UIStepper, UISegmentedControl и UIPageControl.
  • Проведите пальцем по ручке UISlider в направлении, параллельном ползунку.
  • Жест одного пальца на ручке UISwitch в направлении, параллельном переключателю.

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

Смежные вопросы