UIScrollView с касаниями подпредставлений, не исключенными, если суперпредставление вовлечено - PullRequest
0 голосов
/ 22 октября 2018

Итак, я пытаюсь создать интерфейс, в котором возможно по существу 3 уровня просмотра.

  1. UIView отвечает за определение метаданных новых ячеек
  2. Сами ячейки
  3. Фон UIScrollView

Все является дочерним элементом UIScrollView, однако 1 отображается поверх 2.

Цель состоит в том, чтобы все ячейкиможно перетаскивать, а представление прокрутки можно прокручивать.Однако, когда прокручивается представление прокрутки, это должно инициировать создание нового узла и, следовательно, появление представления 1, которое исчезнет при нажатии кнопки отправки.

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

class Node: UILabel {

    var recognizer:UIPanGestureRecognizer?
    init() {
        self.isExclusiveTouch = true
        self.isUserInteractionEnabled = true

        recognizer = UIPanGestureRecognizer(target: self, action: #selector(drag))
        self.addGestureRecognizer(recognizer!)
    }

    @objc
    func drag(rec: UIPanGestureRecognizer) {
        goToPoint(point: rec.location(in: self.superview!))
    }

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        var shouldReceive = false
        if let clickedView = touch.view {
            if clickedView == self {
                shouldReceive = true;
            }
        }
        return shouldReceive
    }
}

class NodeCreator: UIView {

    var submit: UIButton = UIButton(type: UIButton.ButtonType.roundedRect)

    init() {
        super.init(frame: CGRect.zero)

        submit.setTitle("Submit", for: .normal)
        submit.translatesAutoresizingMaskIntoConstraints = false
        submit.addTarget(self, action: #selector(press), for: .touchUpInside)
        self.addSubview(submit)
    }

    @objc func press() {
        if let d = delegate {
            if let t = inputField.text {
                d.created(title: t, pt: storeP)
                self.removeFromSuperview()
            }
        }
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
class TaskView: UIScrollView, CreationDelecate{

    func created(title: String, pt: CGPoint) {
        let temp = Node()
        view.addNode(temp, at: pt)
    }

    var tapRecognizer:UITapGestureRecognizer?

    var nodeSet:[Node] = []
    func addNode(_ n1: Node, at: CGPoint = CGPoint.zero) {
        nodeSet.append(n1)
        n1.goToPoint(point: at)
        self.addSubview(n1)
        self.bringSubviewToFront(n1)

        self.isScrollEnabled = true
        self.isUserInteractionEnabled = true
        self.isExclusiveTouch = false

        self.canCancelContentTouches = false

        if (tapRecognizer == nil) {
            tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
            self.addGestureRecognizer(tapRecognizer!)
        }
    }

    @objc func tap(rec: UITapGestureRecognizer) {
        let pos = rec.location(in: self)
        let creator = NodeCreator(pt: pos)
        creator.delegate = self
        self.addSubview(creator)
    }

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        var shouldReceive = false
        if let clickedView = touch.view {
            if clickedView == self {
                shouldReceive = true;
            }
        }
        return shouldReceive
    }
}

Почему TaskView все еще получает жесты касания, когда все узлы являются эксклюзивными.

1 Ответ

0 голосов
/ 01 ноября 2018

Код не работает, потому что вы не назначили делегата для распознавателей жестов.Функции делегатов реализованы в классах Node и TaskView.Но вы не объявили классы как делегаты, т.е.

class TaskView: UIScrollView, CreationDelecate, UIGestureRecognizerDelegate

Чем назначить делегат для распознавателя жестов:

recognizer.delegate = self as! UIGestureRecognizerDelegate

Должно работать

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