Search code examples
swiftuiscrollviewsizeframeuistackview

How to get a custom scrollingStackView's height


I have a custom view, it's a scrolling view with a stack view in it. And I added 3 container views inside this stack view to stack and scroll vertically. Inside each container view I add either a UIImage or a UILabel view.

I don't want my scrollview to scroll if all the views are already visible on screen. For this I need to know the height of my scrollingStackView, so I can compare it with the current screen size. Here is how I set them up in viewDidLoad:

setupScrollingSV()

setupContainer1()
setupContainer2()
setupContainer3()

setupImageViewInContainer1()
setupImageViewInContainer2()
setupLabelViewInContainer3()

My custom scrolling stack view doesn't have a size, I lay it out programmatically giving left, right, top anchors.

scrollingSV.leftAnchor.constraint(equalTo: stackView.leftAnchor).isActive = true
scrollingSV.rightAnchor.constraint(equalTo: stackView.rightAnchor).isActive = true
scrollingSV.topAnchor.constraint(equalTo: stackView.topAnchor).isActive = true

And there is another stack view that is in safe area of my view, which has this scrolling stack view and another container view ContainerView4.

I layout ContainerView4 like this:

ContainerView4.leftAnchor.constraint(equalTo: stackView.leftAnchor).isActive = true
ContainerView4.rightAnchor.constraint(equalTo: stackView.rightAnchor).isActive = true
ContainerView4.topAnchor.constraint(equalTo: scrollingSV.bottomAnchor).isActive = true
ContainerView4.bottomAnchor.constraint(equalTo: stackView.bottomAnchor).isActive = true
ContainerView4.heightAnchor.constraint(equalToConstant: 100.0).isActive = true

Lastly, when I use debug view hierarchy I do see the height and width for my scrollingSV, and the views inside the containers.

enter image description here

enter image description here

Here is the code I am trying to get a size for the scrollingSV, which returns 0:

print("Scrollview height: \(scrollingSV.contentSize.height )")

I already tried to get the content size by using union as told in this stackoverflow answer: How do I auto size a UIScrollView to fit its content But this also returns 0.

How can I get this scrolling stack view's size? Or is it not calculated yet in viewDidLoad?

Thank you


Solution

  • Apparently in viewDidLoad the views were not finished with laying out their subviews. So the height was not meaningful yet.

    When I did this check in viewDidAppear, the problem is fixed and I could reach the scrolling stack view's contentSize and frame height.

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        scrollingSV.isScrollEnabled = scrollingSV.contentSize.height > scrollingSV.frame.height
      }