动态UITableView高度

WKL*_*WKL 11 uitableview ios swift

我想设置UITableView以匹配表视图中所有内容的高度.

这是我的故事板

在此输入图像描述

这个问题是顶部和底部的ImageView在屏幕上始终是静态的.

在此输入图像描述

假设桌面视图中有10个项目,但由于屏幕尺寸限制,只有7个项目显示.我希望在用户能够看到底部的ImageView之前显示所有10个.(顺便说一句,所有3个视图,即图像视图和tableview都在uiscrollview中)

理想

在此输入图像描述

我必须处理的一些其他限制是表视图中的项目数是动态的,这意味着它可以是任何通常小于10的数量,我稍后将从api中检索.根据内容,细胞高度也是动态的.

我刚刚开始使用一些简单的代码

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
      @IBOutlet weak var tableView: UITableView!

  var items: [String] = [
    "Item 01", "Item 02", "Item 03", "Item 04", "Item 05",
    "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"]

  override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
  }

  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.items.count;
  }

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell
    cell.textLabel?.text = self.items[indexPath.row]
    return cell
  }

}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ody 16

  1. 将您的UITableView子类化以覆盖intrinsicContentSize为其contentSize,如下所示:

    override var intrinsicContentSize: CGSize {
        return contentSize
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后为表使用自动行高,因此exampleViewController的viewDidLoad将具有:

    tableView.estimatedRowHeight = 44
    
    Run Code Online (Sandbox Code Playgroud)

    和UITableViewDelegate函数:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 当您从API接收数据并重新加载表时,只需致电:

    tableView.invalidateIntrinsicContentSize()
    
    Run Code Online (Sandbox Code Playgroud)

    这将告诉您的表格将其自身调整为与其内容相同的大小(因为覆盖),并根据需要移动底部图像.


如果你的故事板抛出一个错误,说UIScrollView的高度不明确,因为UITableView上没有高度限制,请选择你的UITableView并在Size Inspector中给它一个占位符内在大小.


nik*_*ans 14

使用子类化技术的答案是不完整的。你也应该layoutSubviews()像这样覆盖。

public class DynamicSizeTableView: UITableView
{
    override public func layoutSubviews() {
        super.layoutSubviews()
        if bounds.size != intrinsicContentSize {
            invalidateIntrinsicContentSize()
        }
    }

    override public var intrinsicContentSize: CGSize {
        return contentSize
    }
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*art 11

这是我在生产应用程序中使用的:

雨燕 5,2021 年

import UIKit

class DynamicTableView: UITableView {

    /// Will assign automatic dimension to the rowHeight variable
    /// Will asign the value of this variable to estimated row height.
    var dynamicRowHeight: CGFloat = UITableView.automaticDimension {
        didSet {
            rowHeight = UITableView.automaticDimension
            estimatedRowHeight = dynamicRowHeight
        }
    }

    public override var intrinsicContentSize: CGSize { contentSize }

    public override func layoutSubviews() {
        super.layoutSubviews()
        if !bounds.size.equalTo(intrinsicContentSize) {
            invalidateIntrinsicContentSize()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Puj*_*ono 8

更新 Swift 4 此代码运行良好

self.scrollView.layoutIfNeeded()
self.view.layoutIfNeeded()
self.tableViewHeightConstraint.constant = CGFloat(self.tableView.contentSize.height)
Run Code Online (Sandbox Code Playgroud)


rr1*_*1g0 6

您需要将 IBOutlet 设置为NSLayoutConstraint设置tableView高度的(首先您需要使用任何值创建高度约束,无所谓),然后按 ctrl 将其拖到您的类文件中

在此处输入图片说明

然后viewWillAppear你必须计算tableView高度并设置它。像这样:

var tableViewHeight:CGFloat = 0;
for (var i = tableView(self.tableView , numberOfRowsInSection: 0) - 1; i>0; i-=1 ){
    tableViewHeight = height + tableView(self.tableView, heightForRowAtIndexPath: NSIndexPath(forRow: i, inSection: 0) )
}
tableViewHeightLayout.constant = tableViewHeight
Run Code Online (Sandbox Code Playgroud)

仅此而已。这将使您的 scrollView 内容大小,并且不应引发任何警告。