Почему я не могу взаимодействовать с подпредставлениями? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть контроллер представления, в который я могу добавить несколько подпредставлений с помощью LongPressGesture. Для каждого subview я предоставляю TapGesture, который должен открывать popover для этого представления (см. Рисунок ниже).

Моя проблема в том, что я могу открыть всплывающее окно только для последнего добавленного мной подвида. Так почему я больше не могу взаимодействовать с другими подпредставлениями? Это мое первое приложение на Swift, поэтому было бы неплохо, если бы мне кто-нибудь помог.

Код для вас:
Это LongPressGesture на контроллере представления root, который создает новое подпредставление.

@IBAction func onLongPress(_ gesture : UILongPressGestureRecognizer) {

    let position: CGPoint = gesture.location(in: view)

    if(gesture.state == .began) {
        let subview = MySubview(position: position)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        subview.addGestureRecognizer(tapGesture)

        view.addSubview(subview)
    }
    else if (gesture.state == .ended) {
        let subview = self.view.subviews.last
        self.openContextMenu(for: subview)
    }
}

ViewController с подпредставлениями: -

image

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

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

В моем root контроллере представления я добавил:

    var isPanGesture = false

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        isPanGesture = true

        if let subview = touches.first!.view as? MySubview {
            let position = touches.first!.location(in: self.view)
            link.center = position
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let subview = touches.first!.view as? MySubview {
            if(!isPanGesture) {
                self.openContextMenu(for: subview)
            }
            isPanGesture = false
        }
    }
0 голосов
/ 06 мая 2020

При реакции на событие (долгое нажатие в вашем случае) только первый респондент обработает событие. При добавлении подпредставлений к представлению все подвиды добавляются одно перед другим. Таким образом, последнее добавленное подпредставление будет обрабатывать событие - если оно прослушивает событие. Если вам нужен определенный c subview для обработки события, вы можете вывести его на передний план как

parentView.bringSubviewToFront(view: subView)

В качестве альтернативы вы также можете отключить другие subview как

subView.isUserInteractionEnabled = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...