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")
}