'(Swift 5) UIScrollView scrolls but none of the content scrolls (video included)

I'm trying to learn to build views without storyboard. I tried to build a scrollview. On that scrollview is a UISearchBar, a UIImageView with an image and a UILabel. It works but none of the content moves. The content is all just frozen in place like no matter how far I scroll the search bar will always be on top of the page. and the image on the bottom. I've attached a video to show what I mean. There's also a problem because none of the content is where I want it to be but that's another problem. I realize this is probably because I don't know enough about constraints and autolayout and building views without storyboards.

Here's the video

class HomePageViewController: UIViewController {

var searchedText: String = ""
let label = UILabel()

let searchBar: UISearchBar = {
    let searchBar = UISearchBar()
    searchBar.placeholder = "Where are you going?"
    searchBar.translatesAutoresizingMaskIntoConstraints = false
    searchBar.barTintColor = .systemCyan
    searchBar.searchTextField.backgroundColor = .white
    searchBar.layer.cornerRadius = 5
    return searchBar
}()

let homeImage: UIImageView = {
    let homeImage = UIImageView()
    homeImage.translatesAutoresizingMaskIntoConstraints = false
    homeImage.clipsToBounds = true
    return homeImage
}()

let scrollView: UIScrollView = {
    let scrollView = UIScrollView()
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.backgroundColor = .systemMint
    scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 30)
    return scrollView
}()


override func viewDidLoad() {
    super.viewDidLoad()
    
    view.backgroundColor = .systemPink
 //        setupLayout()
 // tried this here doesn't do anything for me
}

func setupLayout() {
    view.addSubview(scrollView)
    self.scrollView.addSubview(searchBar)
    
    homeImage.image = UIImage(named: "Treehouse")
    self.scrollView.addSubview(homeImage)
    
    label.text = "Inspiration for your next trip..."
    self.scrollView.addSubview(label)
    // not sure where this label is being added I want it to be underneath the image but it isn't t
    
    let safeG = view.safeAreaLayoutGuide
    let viewFrame = view.bounds
    
    NSLayoutConstraint.activate([
        
        scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: -10),
        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        
        searchBar.topAnchor.constraint(equalTo: safeG.topAnchor, constant: 50.0),
        searchBar.widthAnchor.constraint(equalTo: safeG.widthAnchor, multiplier: 0.9),
        searchBar.centerXAnchor.constraint(equalTo: safeG.centerXAnchor),
        
        homeImage.topAnchor.constraint(equalTo: safeG.topAnchor, constant: 150),
        homeImage.widthAnchor.constraint(equalTo: safeG.widthAnchor, multiplier: 1.1),
        homeImage.centerXAnchor.constraint(equalTo: safeG.centerXAnchor),
        homeImage.heightAnchor.constraint(equalToConstant: viewFrame.height/2),
        
        label.topAnchor.constraint(equalTo: homeImage.bottomAnchor, constant: 100)
    ])
 // was doing all this in viewDidLayoutSubviews but not sure if this is better place for it
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    setupLayout()
   // tried this in viewDidLoad() and it didn't solve it. 
}

}

any help would be appreciated



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source