Как мы можем добавить 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!")
}
и я попытался добавить его на один ярлык в раскадровке; но никто не работает.
2 ответа
Решение
Пожалуйста, проверьте User Interaction Enabled
Атрибут вашего UIlabel
в Attribute inspector
из Xcode. User Interaction Enabled
должен быть отмечен для обнаружения крана. Пожалуйста, смотрите картинку ниже,
Во-первых, вам нужно разрешить взаимодействие пользователя с меткой (по умолчанию она отключена):
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
}