swift isUserInteractionEnabled = false не работает внутри UITapGestureRecognizer - PullRequest
0 голосов
/ 09 мая 2020

У меня проблема, когда у меня есть UIScrollView и заголовок (UIView) внутри моего основного представления, а мой заголовок находится над моим UIScrollView как таковым:

UIView.
|
|- UIScrollView.
|
|- Header. (UIView)

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

Подводя итог, я хочу, чтобы мой заголовок обнаруживал касания, но прокручивал вперед до моего UIScrollView.

Чтобы решить эту проблему, я пробовал несколько вещей, и вот некоторые из них:

  1. Добавление UIPanGestureRecognizer в мой заголовок, чтобы он мог обнаруживать перетаскивание
  2. Добавление UITapGestureRecognizer в мой заголовок, чтобы он мог обнаруживать касание
  3. Настройка isUserInteractionEnabled = false при начале перетаскивания, поэтому жест может быть передан следующему UIResponder, которым в данном случае является мой UIScrollView
  4. Настройка isUserInteractionEnabled = true, когда мое перетаскивание имеет fi закончено, чтобы он снова мог обнаруживать касание

Это фрагмент кода:

    override func viewLoad() {
        myScreenEdgePanGestureRecognizer = UIPanGestureRecognizer(target: self, action:#selector(handlePan))
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(handleTap(_:)))
        headerView.addGestureRecognizer(myScreenEdgePanGestureRecognizer)
        headerView.addGestureRecognizer(tapGestureRecognizer)
    }

    @objc func handlePan(_ sender: UITapGestureRecognizer){
        print("dragging")
        if headerView.isUserInteractionEnabled{
            headerView.isUserInteractionEnabled = false
        }
        if sender.state == .began {
        } else if sender.state == .ended {
            headerView.isUserInteractionEnabled = true
        }
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer){
        print("tapped")
    }

На этом этапе я вижу, как перетаскивание и касание обнаруживаются нормально, но по какой-то причине isUserInteractionEnabled = false, похоже, не меняет поведение представления. Этот код действует так, как isUserInteractionEnabled всегда истинно независимо от того, что. touchesBegan, touchesMoved, touchesEnded методы, переопределяющие следующий

установка переменной для возврата ScrollView в качестве следующего UIResponder установка метода isExclusiveTouch в UIButton изменение isUserInteractionEnabled всеми возможными способами

1 Ответ

1 голос
/ 09 мая 2020

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

  1. Подключите делегаты распознавания жестов, например, tapGestureRecognizer.delegate = self
  2. Сделайте свой ViewController совместимым с этим протоколом, например extension YourViewController: UIGestureRecognizerDelegate {}
  3. Реализуйте эту функцию:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }
    
...