iOS: отправка событий касания для просмотра сзади, если касание находится в определенной области - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть вид, который содержит несколько пользовательских элементов управления пользовательского интерфейса.Вид А больше, чем его элементы управления на экране.Представление A находится в ViewController A, которое находится поверх ViewController B (VC B является собственностью VC A).Я хочу сказать моему распознавателю жестов, что когда пользователь касается определенной области в представлении A, представление A вообще не должно реагировать на события касания, но должно использоваться и обрабатываться представлениями в VC B.

Я попытался установить isUserInteractionEnabled в false, когда пользователь касается определенной области в представлении A, чтобы события касания автоматически обрабатывались представлениями за представлением A (или VC A).Проблема в том, что для одного isUserInteractionEnabled установлено значение false, я больше не могу отвечать на события касания в правильной области просмотра A.

Есть ли лучший способ отправки событий касания в представлениевид сзади A, только если он находится в определенной области обзора A?

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы можете переопределить метод pointInside, чтобы сделать представление A в контроллере A, чтобы избежать обработки событий, эффект подобен тому, что делает isUserInteractionEnabled.И у вас также будет возможность рассчитать конкретную площадь.

Пример:

class ViewA: UIView{
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        //assume this area has no response
        let areaNoResponses = CGRect(x: 10, y: 10, width: 100, height: 100) 

        if (areaNoResponses.contains(point)) {
            return false;  //no response, like ViewA.isUserInteractionEnabled = NO
        }
        return true;
    }
}
0 голосов
/ 18 февраля 2019

VC B является свойством VC A

Я предполагаю, что VC B является дочерним контроллером представления для VC A. Теперь, если представление A покрывает представления VCБ, тогда у вас нет другого выбора, кроме как заставить А реагировать на прикосновения.Аналогично, если это контроллеры автономного вида и автономные виды, нажатие на представление A всегда заставит его реагировать на прикосновения.

То, что вы можете сделать, это обнаружить, когда вы хотите, чтобы представления VC B реагировали на прикосновения на представлении Aи передайте требуемую информацию в VC B. И функция в VC B выполнит требуемую задачу, как вы собираетесь.

Пример:

VC A:
let tapGesture = UITapGestureRecognizer(target:action:)
viewA.addGestureRecognizer(tapGesture)

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    //Assuming VC B has been initialized beforehand
    vcB.handleGestureFromVCA()
}

VC B:

@objc func handleGestureFromVCA() {
    // Code for VC B's views go here
}

Надеюсь, это поможет.Если нет, то, пожалуйста, поделитесь с нами тем, что вы пробовали.

...