I've created a view dynamically with quite a bit of complexity: There is a uiView inside a uiScrollView and there are 10 uiLabel inside it. I'm trying to create a click event on uiLabel, but it doesn't work. But if I attach a click event to uiScrollView, it works, but I don't know which uiLabel was clicked. How can I make a uiLabel clickable and check which uiLabel was clicked?
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.backgroundColor = UIColor.lightGray
view.addSubview(scrollView)
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
let contentView = UIView()
contentView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(contentView)
NSLayoutConstraint.activate([
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
])
var labelArray = [UILabel]()
for i in 0..<10 {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "Label \(i+1)"
label.textAlignment = .center
label.backgroundColor = UIColor.white
contentView.addSubview(label)
labelArray.append(label)
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: contentView.topAnchor, constant: CGFloat(50 * i + 20)),
label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 20),
label.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20),
label.heightAnchor.constraint(equalToConstant: 40)
])
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(labelTapped(_:)))
label.addGestureRecognizer(tapGesture)
label.isUserInteractionEnabled = true
}
}
@objc func labelTapped(_ sender: UITapGestureRecognizer) {
print("clicked")
if let label = sender.view as? UILabel {
print("Tapped Label: \(label.text ?? "")")
}
}
}