Как вы определяете приоритет того же типа UIGestureRecognizer? - PullRequest
0 голосов
/ 17 января 2019

У меня есть базовый UIView, с другим вложенным UIView. Представьте себе коробку с меньшей коробкой внутри. Это может быть даже UIImageView внутри. Просто какой-то тип зрения. Каждое из двух представлений должно иметь UITapGestureRecognizer. Когда я нажимаю в любом месте внешнего вида за пределами внутреннего вида, я выполняю одно действие. Когда я касаюсь внутреннего вида, я хочу сделать другое действие.

Пример: у меня есть внешний вид контейнера и внутренний UIImageView. Если я коснусь внешнего вида за пределами внутреннего, то перейду к следующему экрану. Если я коснусь представления внутреннего изображения, оно отобразит изображение в увеличенном виде во всплывающем окне.

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

Apple указывает, как различать различные типы распознавателей жестов в этих документах по адресу https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another, но это не показывает использование одинаковых двух распознавателей жестов с одним и тем же делегатом. Как это достижимо? Возможно, я не правильно понимаю документы.

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

Ниже приведен код. У меня есть представления, созданные в конструкторе интерфейса с выходами в конкретном представлении. campaignContentView - это родительское представление, а pictureImageView и linkDetailsView - это дочерние представления. Иногда я просто показываю картинку, которая должна сделать одну вещь. В других случаях у меня есть ссылка со связанным миниатюрой, и нажатие на любую из них должно сделать другое дело.

@IBOutlet weak var campaignContentView: UIView!
@IBOutlet weak var pictureImageView: UIImageView!
@IBOutlet weak var linkDetailsView: UIView!

private func addNewGestureRecognizer(_ view: UIView) {
        let tapView = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedView(_:)))
        campaignContentView.addGestureRecognizer(tapView)

        switch view {
        case linkDetailsView:
            let tapLinkDetails = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
            let tapLinkPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
            view.addGestureRecognizer(tapLinkDetails)
            pictureImageView.addGestureRecognizer(tapLinkPicture)
        case pictureImageView:
            let tapPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedPicture(_:)))
            view.addGestureRecognizer(tapPicture)
        default:
            print("No new gesture necessary")
        }
    }

Я также звоню bringSubviewToFront(pictureImageView) и bringSubviewToFront(linkDetailsView) соответственно. Оказывается, что распознаватель жестов для linkDetailsView на самом деле работает правильно, только не pictureImageView

1 Ответ

0 голосов
/ 17 января 2019

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

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

Я создал две простые коробки с жестами на детской площадке ...

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let innerView = UIView()
        innerView.backgroundColor = UIColor.red

        view.addSubview(innerView)
        innerView.translatesAutoresizingMaskIntoConstraints = false
        innerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        innerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        innerView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        innerView.heightAnchor.constraint(equalToConstant: 100).isActive = true

        self.view = view

        let outTapGesture = UITapGestureRecognizer(target: self, action: #selector(outterViewTapped))
        let innerTapGesture = UITapGestureRecognizer(target: self, action: #selector(innerViewTapped))

        view.addGestureRecognizer(outTapGesture)
        innerView.addGestureRecognizer(innerTapGesture)
    }

     @objc func outterViewTapped() {
       print("Outter tapped!")
     }

     @objc func innerViewTapped() {
       print("Inner tapped!")
     }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
...