Отвечать на событие касания для ребенка и родителя - PullRequest
0 голосов
/ 25 марта 2019

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

Как мне это сделать?

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

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return false
    }

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Быстрый пример ...

Нажмите «innerView», и вы увидите два отладочных отпечатка «штрихи начались». Нажмите «внешний вид», и вы увидите только один.

class TouchView: UIView {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        print("touches began in \(self)")
    }

}

class TouchTestViewController: UIViewController {

    let innerView: TouchView = {
        let v = TouchView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .red
        return v
    }()

    let outerView: TouchView = {
        let v = TouchView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .cyan
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(outerView)
        outerView.addSubview(innerView)

        NSLayoutConstraint.activate([

            outerView.widthAnchor.constraint(equalToConstant: 300),
            outerView.heightAnchor.constraint(equalToConstant: 300),
            outerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            outerView.centerYAnchor.constraint(equalTo: view.centerYAnchor),

            innerView.widthAnchor.constraint(equalToConstant: 150),
            innerView.heightAnchor.constraint(equalToConstant: 150),
            innerView.centerXAnchor.constraint(equalTo: outerView.centerXAnchor),
            innerView.centerYAnchor.constraint(equalTo: outerView.centerYAnchor),

            ])

    }

}
1 голос
/ 25 марта 2019

Если у вас есть подклассы для обоих представлений, вы можете переопределить метод UIView touchesBegan .Если вы вызываете метод super touchesBegan, то это должно привести к полученному вами результату, поскольку событие распространяется по цепочке респондента.(т. е. если пользователь коснется дочернего представления, на сенсорное событие ответят как дочерний, так и родительский элемент)

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