UIScrollView 高度不会根据视图大小动态更新?

Posted

技术标签:

【中文标题】UIScrollView 高度不会根据视图大小动态更新?【英文标题】:UIScrollView height not updated dynamically based on views size? 【发布时间】:2018-11-01 06:36:06 【问题描述】:

我有 VC,因为我添加了 UIScrollView -> UIView。之后我添加了 3 个 tableViews 并添加了约束。基于内容 tableViews 动态调整大小,例如 tbl1、tbl2 和 tbl3 分别有 10、5 和 7 行。根据内容,我想更新我的整个视图。这里tableViews height更新成功,但不是ScrollView

我的代码是...

override func viewDidLoad() 
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    tbl1.delegate = self
    tbl1.dataSource = self
    tbl2.delegate = self
    tbl2.dataSource = self
    tbl3.delegate = self
    tbl3.dataSource = self


override func viewDidLayoutSubviews() 

    DispatchQueue.main.async 
        //Update tbl1 frame
        var frame = self.tbl1.frame
        frame.size.height = self.tbl1.contentSize.height
        self.tbl1.frame = frame
        //Update tbl2 frame
        var frame2 = self.tbl2.frame
        let y = self.tbl1.frame.maxY
        frame2.origin.y = y
        frame2.size.height = self.tbl2.contentSize.height
        self.tbl2.frame = frame2
        //Update tbl3 frame
        var frame3 = self.tbl3.frame
        let y2 = self.tbl2.frame.maxY
        frame3.origin.y = y2
        frame3.size.height = self.tbl3.contentSize.height
        self.tbl3.frame = frame3
    



// MARK: - UITableView Delegates
func numberOfSections(in tableView: UITableView) -> Int 

    return 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if tableView == tbl1 
        return 10
     else if tableView == tbl2 
        return 5
     else 
        return 7
    


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if tableView == tbl1 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "TBL ONE"

        return cell
     else if tableView == tbl2 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "TBL TWO"

        return cell
     else 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "TBL THREE"

        return cell
    


【问题讨论】:

你在哪里更新你的滚动视图高度? 显示你添加到scrollView的约束。 其实我并没有更新scrollview,因为我在scrollView的最后一个tableview底部添加了约束 @PGDev 首先我添加了 ScrollView Cons:0,0,0,0。我在 scrollView Cons:0,0,0,0 上添加了视图,宽度等于主视图,高度等于主视图。之后我添加了 tableViews tbl1 cons: 0,0,0, height 125. Tbl2 Cons: 0,0,0, height 125. tbl3 cons: 0,0,0,0 【参考方案1】:

只需将此行添加到viewDidLayoutSubviews() 的末尾

self.scrollView.contentSize.height = self.tbl1.contentSize.height + self.tbl2.contentSize.height + self.tbl3.contentSize.height

【讨论】:

这是什么subviews.last!在 self.myScrollView.subviews[0].subviews.last! 我发表评论你可以设置你的 tableview3 或检查 subview 是否等于 tableview3 我复制了你的代码,并在 viewDidLayoutSubviews() 中调用了那个(setScrollViewContentSize()) 函数。但是滚动视图没有更新 我正在设置滚动高度:212.0 我认为你的故事板约束不合适

以上是关于UIScrollView 高度不会根据视图大小动态更新?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中宽度和高度相等的动态按钮

如何根据视图高度值的变化上下移动UIScrollView?

使用自动布局向 UIScrollView 添加动态大小的视图(高度)

将动态高度设置为 UIScrollView Swift

允许滚动视图的高度根据图像大小而改变

UIScrollView 内容大小在不应该时裁剪子视图