0

所以我有一个scrollView, 里面scrollView是一个stackView包含views屏幕中的每个。

问题是我stackView有很多可隐藏的,views所以我需要containsVieww's height根据我的stackView's height

我的伪代码应该是这样的:


 override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    print(stackView.bounds.height)
    // do logic to change contentView size here
 }
func setupView(){
    scrollView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
    scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    scrollView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
    scrollView.backgroundColor = .white
    scrollView.contentSize = CGSize(width: view.frame.width, height: view.frame.height)
    
    scrollView.addSubview(stackView)
    stackView.setArrangedSubView(views: [label1, label 2, label 3, label 4, ..., label n]
    [label1, label 2, label 3].isHidden = true
}

func onHitButton(){
   if isHidden {
   [label1, label 2, label 3].isHidden = false
   isHidden = false
  } else {
   [label1, label 2, label 3].isHidden = true
   isHidden = true
  }
  print(stackView.bounds.height) // still return the ex height
}

这是问题所在:

首先init,我的[label1,2,3].isHidden = true,我stackViewHeight的是500

当 myonHitButton被调用时, my [label1,2,3].isHidden = false, mystackViewHeight仍然是,500但屏幕显示正确,这些labels现在可见并且 mystackView被拉伸。当然,我scrollView的 is 显示不正确。

然后我onHitButton再次点击我的,那些labels是隐藏的,我stackView的在屏幕上缩小但stackViewHeight返回了850

应该是反过来的。

我也试过on another call 并返回正确print的?好像叫得太早了。heightbuttonheightviewDidLayoutSubviews

总结一下:stackView在它自己调整大小之前返回高度

4

1 回答 1

1

使用自动布局将堆栈视图约束到滚动视图的内容布局指南

    scrollView.addSubview(stackView)
    
    stackView.translatesAutoresizingMaskIntoConstraints = false
    
    // reference to scrollView's Content Layout Guide
    let cGuide = scrollView.contentLayoutGuide

    // reference to scrollView's Frame Layout Guide
    let fGuide = scrollView.frameLayoutGuide
    
    NSLayoutConstraint.activate([
        
        // constrain stackView to scrollView's Content Layout Guide
        stackView.topAnchor.constraint(equalTo: cGuide.topAnchor),
        stackView.leadingAnchor.constraint(equalTo: cGuide.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: cGuide.trailingAnchor),
        stackView.bottomAnchor.constraint(equalTo: cGuide.bottomAnchor),
        
        // constrain stackView's Width to scrollView's Frame Layout Guide
        stackView.widthAnchor.constraint(equalTo: fGuide.widthAnchor),
        
    ])
    

这将完全避免设置的需要.contentSize——这一切都将由自动布局处理。

于 2021-10-07T16:10:34.393 回答