Button does not work in scroll view. I did spend lot of time struggling with this and looking for help. Finally I found this answer:
Add buttons to UIScrollView Swift 5 programmatically
where UIStackView made things easy.
My adaptation of the solution did go something like this:
override func viewDidLoad() {
super.viewDidLoad()
let subView = UIView()
view.addSubview(subView)
subView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
subView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0),
subView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0),
subView.widthAnchor.constraint(equalToConstant: 400),
subView.heightAnchor.constraint(equalToConstant: 250),
])
let scrollView = UIScrollView()
subView.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: subView.topAnchor, constant: 0),
scrollView.bottomAnchor.constraint(equalTo: subView.bottomAnchor, constant: 0),
scrollView.leadingAnchor.constraint(equalTo: subView.leadingAnchor, constant: 0),
scrollView.trailingAnchor.constraint(equalTo: subView.trailingAnchor, constant: 0),
])
let stackView = UIStackView()
scrollView.addSubview(stackView)
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 8.0),
stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor, constant: 8.0),
stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor, constant: -8.0),
stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: -8.0),
])
// Create what ever content you need to be shown in the scroll view.
// In this example long view with a button somewhere in the middle.
let content = UIView()
stackView.addArrangedSubview(content)
content.backgroundColor = .gray
content.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
content.widthAnchor.constraint(equalTo: subView.widthAnchor, constant: -10),
content.heightAnchor.constraint(equalToConstant: 1000.0),
])
let button = UIButton(type: .system)
button.frame = CGRect(x: 0, y: 0, width: 100, height: 50)
button.backgroundColor = .blue
button.setTitle("Button", for: .normal)
button.center = CGPoint(x: 100, y: 400)
content.addSubview(button)
button.addTarget(self, action: #selector(click), for: .touchDown)
}
@objc func click(_ sender : UIButton) {
print("Click")
}