Разница между UITapGestureRecognizer и addTarget
Кто-нибудь может прояснить разницу между этими двумя способами запуска функции при нажатии на представление?
1)myView.addTarget(self, action: #selector(myFunctionToTrigger(_:)), forControlEvents: UIControlEvents.TouchUpInside)
2)let tapGesture = UITapGestureRecognizer(target: self, action:
#selector(myFunctionToTrigger(_:)))
myView.addGestureRecognizer(tapGesture)
5 ответов
Это 2 совершенно разных способа реализации обработки пользовательских событий в приложениях iOS.
1). addTarget()
- это метод на UIControl
класс, который является частью механизма целевого действия. Подробнее об этом в документации.
И ты не можешь addTarget
малыш UIView
, только для того, чтобы UIControl
подклассы.
2). UIGestureRecognizer
Подклассы - это просто механизм, позволяющий обнаруживать и различать жесты пользователя в конкретном представлении.
Основное различие между ними в том, что распознаватели жестов могут обнаруживать более сложные события, такие как пролистывание, сжатие или масштабирование, но -addTarget
это очень эффективный способ обнаружения активности пользователей, а также обеспечивает одинаковый уровень интерфейса для всех UIControl
такие как UISegmetedControl
, UISlider
, так далее.
Надеюсь, что я тебе помог.
Эти два метода работают на двух разных уровнях абстракции:
addTarget:action:forControlEvents
это нижний уровень, который обеспечивает изолированные события. Некоторые из этих событий должны быть объединены и интерпретированы для обнаружения более сложных жестов, таких как смахивание или сжимание.addGestureRecognizer
работает на более высоком уровне ближе к тому, что обычно требуется приложению. Он добавляет специальное средство распознавания жестов, которое прослушивает события низкого уровня, обнаруживает жесты и доставляет конкретную информацию о жесте.
В случае крана разница незначительна. Но когда речь идет о смахивании, сжимании и комбинации касания, смахивания, сжимания (например, в приложении для просмотра изображений или в приложении карты), один или несколько распознавателей жестов являются подходящим способом.
Вот разница
За UITapGestureRecognizer
Вы можете добавить событие для указанных жестов, таких как UITapGestureRecognizer, UIPanGestureRecognizer
... и много других жестов.
Где как UIView
addTarget()
Вы можете добавить цель для указанных событий, таких как UIControlEvents.TouchUpInside
.. и много других событий.
Ответ Павла верный, вы можете добавить только цель в UIControlView, который является подклассом UIView. UIGestureRecognizer может быть добавлен в любой UIView.
Ответ Кодо о том, что цель находится на более низком уровне, чем жест, неверен, жесты - это поддержка касаний более низкого уровня. UIControl использует жесты, чтобы заставить addTarget:action:forControlEvents работать.
Есть несколько преимуществ для addTarget:
- Это встроенная функция. Вам не нужно инициализировать другой объект, чтобы сделать то же самое.
- Вы можете указать, когда реагировать на действие: "touchUpInside" или "touchDown" (или "valueChanged" для ползунков).
- Вы можете установить различные виды кнопки (например, текст заголовка, цвет заголовка, изображение содержимого, фоновое изображение, оттенок подсветки), и кнопка отображает эти состояния только при использовании addTarget.
Помимо вышеперечисленных преимуществ, я думаю, что это больше похоже на соглашение о кодировании элементов UIControl.