Подкласс UIControl получает "touchesCancelled" вместо "touchesEnded" - PullRequest
0 голосов
/ 04 сентября 2018

В моем проекте у меня есть главный вид, в который я добавляю UITapGestureRecognizer, а внутри этого основного вида у меня есть подпредставление, которое является пользовательским UIControl, которое я назову UICustomButton.

UICustomButton переопределяет следующие методы UIControl:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        pressAnimation()
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        releaseAnimation()
        listener?.onClick(sender: self)
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesCancelled(touches, with: event)
        releaseAnimation()
    }

Проблема, с которой я столкнулся, заключается в том, что все "касания клика" выполняют следующие обратные вызовы:

  • touchesBegan
  • touchesCancelled

Обратный вызов touchesEnded не вызывается, его как бы игнорируют, и я не знаю почему.

Как можно заставить touchesEnded вызываться вместо touchesCancelled при касании?


Некоторые факты:

  • если я удаляю UITapGestureRecognizer из родительского представления, все работает нормально;
  • , даже не вызывая supers и переопределяя все touches методы, touchesCancelled называется = /;
  • если я делаю "длинное касание" или "большой движущийся жест", то touchesEnded называется: o.

1 Ответ

0 голосов
/ 04 сентября 2018

Это правильное поведение для представления, к которому прикреплен распознаватель жестов.

Документация UIGestureRecognizer гласит: «Если распознаватель жестов распознает его жест, остальные касания для представления отменяются»:

https://developer.apple.com/documentation/uikit/uigesturerecognizer

Свойство cancelsTouchesInView (по умолчанию true) определяет, отменяются ли касания при распознавании жеста:

https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview

Поскольку длительное касание и пролистывание не не распознаются устройством распознавания касаний, оно не мешает им. только вмешивается, когда распознает касание.

Если установить для свойства cancelsTouchesInView распознавателя значение false, касания отменять не следует, и метод touchesEnded(_:with:) будет вызываться как обычно.

Вы можете установить это свойство либо в коде, либо в Интерфейсном Разработчике (если вы добавили распознаватель жестов, перетащив его в раскадровку).

...