Кнопка «Запретить» для срабатывания, когда она находится позади представления с помощью UITapGestureRecognizer - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующие настройки:

enter image description here

  1. Синий фон в zPosition = 0
  2. Желтая кнопка в zPosition = 0 с действием для печати «Нажатие кнопки»
  3. UIView с серым фоном и 0,8 альфа при zPosition = 1 с UITapGestureRecognizer с действием для печати «Серое представление повернуто»

Когда Я постучал в серую область, напечатано «Серый вид постукивал». Но если я нажал на месте желтой кнопки, напечатано «Нажатие кнопки». Я ожидал, что всегда напечатал «Серый вид повернут», потому что этот вид находится перед кнопкой. Как я могу предотвратить запуск кнопки, расположенной за представлением?

Я знаю, что могу установить для кнопки значение .isEnabled = false, но это не подходящее решение, так как серый фон создается в родительском элементе. контроллер представления от ведьмы все мои представления наследуют.

Я установил серый вид на .isUserInteractionEnabled = true (даже если это значение по умолчанию), как указано здесь: В Stackoverflow

Я подумал, используя Apple Documentation , но проблема в том, что вместо нескольких распознавателей жестов есть кнопка и распознаватель жестов.

Есть идеи, как это сделать правильно?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

@ Далджит приведет меня к решению. Используя иерархию представления отладки, я понял, что моя кнопка находится сверху представления. Моя ошибка была в том, что я не осознавал разницу между UIView.layer.zPosition и порядком подпредставлений в иерархии. Представление может быть нарисовано позади другого представления, но, тем не менее, находиться впереди в иерархии представлений.

Решение было использовать view.bringSubviewToFront(greyView)

Имейте в виду, что если вы добавите кнопку после вызова этого последнего строка кода, кнопка будет размещена в верхней части иерархии просмотра

0 голосов
/ 12 марта 2020

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

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if let firstTouch = touches.first {
    let hitView = self.view.hitTest(firstTouch.location(in: yourBtn), with: event)

    if hitView === yourBtn {
        print("touch is inside")
    } else {
        print("touch is outside")
    }
 }
}
...