Как мы можем добавить UIGestureRecognizer в Outlet Collection?

Я пытаюсь добавить жест касания к коллекции меток [UILabel] на выходе, например так:

@IBOutlet var subLabels: [UILabel]!

    override func viewDidLoad() {
            super.viewDidLoad()

            let tap = UITapGestureRecognizer(target: self, action: #selector(HomePageViewController.selectSubLabel(tap:)))
            tap.numberOfTapsRequired = 1
            tap.cancelsTouchesInView = false

            for i in (0..<(subLabels.count)) {
                subLabels[i].addGestureRecognizer(tap)
            }
    }

    func selectSubLabel(tap: UITapGestureRecognizer) {
            print("Gesture Is WORKING!")
        }

и я попытался добавить его на один ярлык в раскадровке; но НИ ОДИН не работает.


person Dory Daniel    schedule 29.03.2017    source источник


Ответы (2)


Пожалуйста, проверьте атрибут User Interaction Enabled ваших UIlabel в Attribute inspector Xcode. User Interaction Enabled должен быть отмечен для обнаружения крана. Пожалуйста, посмотрите на картинку ниже,

введите здесь описание изображения

person arunjos007    schedule 29.03.2017

Во-первых, вам нужно разрешить взаимодействие пользователя с этикеткой (по умолчанию она отключена):

for i in (0..<(subLabels.count)) {
    subLabels[i].isUserInteractionEnabled = true
    subLabels[i].addGestureRecognizer(tap)
}

но распознаватель жестов может наблюдать за жестами только в одном представлении. Итак, есть два варианта:

I. Отдельный распознаватель жестов для каждой метки

for i in (0..<(labels.count)) {
    let tap = UITapGestureRecognizer(target: self, action: #selector(selectSubLabel(tap:)))
    labels[i].isUserInteractionEnabled = true
    labels[i].addGestureRecognizer(tap)
}

II. Один распознаватель жестов для родительского представления меток

override func viewDidLoad() {
    super.viewDidLoad()

    for i in (0..<(labels.count)) {
        subLabels[i].isUserInteractionEnabled = true
    }

    let tap = UITapGestureRecognizer(target: self, action: #selector(selectSubLabel(tap:)))
    view.addGestureRecognizer(tap)
}

func selectSubLabel(tap: UITapGestureRecognizer) {
    let touchPoint = tap.location(in: view)
    guard let label = subLabels.first(where: { $0.frame.contains(touchPoint) }) else { return }

    // Do your stuff with the label
}
person Rafał Rębacz    schedule 29.03.2017