PanGestureRecognizer на дочернем контроллере представления - PullRequest
0 голосов
/ 24 апреля 2019

У меня установлено PanGestureRecognizer в представлении контейнера дочернего контроллера.По сути, это представление в виде выдвижного ящика, поэтому я хочу, чтобы дочерний контроллер представления обрабатывал любые прокрутки, за исключением случая, когда табличное представление контроллера дочернего представления прокручивается вверх, а пользователь перемещается вниз.В этом случае я хочу, чтобы распознаватель жестов представления контейнера вступил во владение, чтобы дочерний контроллер представления в целом мог быть анимирован вниз.У меня есть делегат для распознавателя жестов, и это прекрасно работает, если вместо контроллера дочернего представления и представления контейнера это просто табличное представление, и я добавляю к нему распознаватель жестов панорамирования.Хотя теперь это так, делегат возвращает true, когда это должно быть, но метод handlePan не вызывается?Любые идеи были бы хорошы.Спасибо!

Весь приведенный ниже код находится в родительском UIViewController, у которого есть контейнерное представление, к которому я применяю распознаватель жестов.Все отображается правильно, только метод распознавания жестов не вызывается, но делегат.

func setUpItemDetailsController() {
        guard let itemDetailsController = itemDetailsController else { return }
        add(itemDetailsController)
        itemDetailsContainerView.addSubview(itemDetailsController.view)

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan))
        panGestureRecognizer.delegate = self
        itemDetailsContainerView.addGestureRecognizer(panGestureRecognizer)
    }

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
     ...
}

extension MoverScanAndDiscoverResultController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer else { return true }

        let translation = panGestureRecognizer.translation(in: view).y
        let topLimit = view.bounds.height - self.statusAndNavBarCombinedHeight

        print(itemDetailsTableView.contentOffset.y)

        // Allows for normal UITableView scrolling
        if translation < 0
            && resultCardViewBottomConstraint.constant == topLimit
            || itemDetailsController?.tableView.contentOffset.y ?? 0 > 0 {
            return false
        }

        return true
    }
}

1 Ответ

0 голосов
/ 29 апреля 2019

Вы пробовали использовать функцию UIGestureRecognizerDelegate для распознавания одновременно с другими распознавателями жестов?

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // etc...

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panned(_:)))
        panGestureRecognizer.delegate = self
        self.tableView.addGestureRecognizer(panGestureRecognizer)
    }

    @objc
    func panned(_ sender: UIPanGestureRecognizer) {
        print("Panning")
    }
}

extension MyViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true // obviously this could be more refined if you have other gesture recognizers
    }
}

Я не пытался добавить распознаватель жестов в представление контейнера, но добавление его непосредственно в tableView отлично работает для меня.

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