如何将 UITableView 的高度调整为内容大小的高度?
Posted
技术标签:
【中文标题】如何将 UITableView 的高度调整为内容大小的高度?【英文标题】:How to adjust height of UITableView to be the height of the content size? 【发布时间】:2022-01-22 22:22:04 【问题描述】:我想让表格视图的高度动态化,我想在表格视图的下方和上方添加一些其他视图。我正在尝试在滚动视图中添加表格视图以使其滚动。
但是,我找不到正确的输出。
表格视图行可能不同 表格上方和下方可能存在视图 表格视图不应滚动 只有滚动视图才能滚动这是我的代码:
class ViewController: UIViewController
var content = [Int]()
var scroll: UIScrollView =
let view = UIScrollView()
return view
()
var table: DynamicSizeTableView =
let view = DynamicSizeTableView()
view.estimatedRowHeight = 64
view.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
return view
()
var image: UIImageView =
let img = UIImageView(image: UIImage(systemName: "square.and.arrow.up"))
img.widthAnchor(equalTo: 64)
img.heightAnchor(equalTo: 64)
return img
()
override func viewDidLoad()
super.viewDidLoad()
setupViews()
table.delegate = self
table.dataSource = self
for i in 0...60
self.content.append(i)
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
self.view.layoutIfNeeded()
func setupViews()
self.view.addSubview(scroll)
scroll.fill(to: view)
scroll.addSubview(table)
scroll.addSubview(image)
table.topAnchor(equalTo: self.scroll.topAnchor)
table.leadingAnchor(equalTo: self.scroll.leadingAnchor)
table.trailingAnchor(equalTo: self.scroll.trailingAnchor)
image.topAnchor(equalTo: self.table.bottomAnchor)
image.bottomAnchor(equalTo: self.scroll.bottomAnchor)
extension ViewController: UITableViewDelegate, UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return content.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.backgroundColor = .red
cell.textLabel?.text = "Row \(content[indexPath.row])"
return cell
public class DynamicSizeTableView: UITableView
override public func layoutSubviews()
super.layoutSubviews()
if bounds.size != intrinsicContentSize
invalidateIntrinsicContentSize()
override public var intrinsicContentSize: CGSize
return contentSize
【问题讨论】:
【参考方案1】:你应该试试stackview。将stackview约束到scrollview,stackview将处理内部元素的高度。如果你愿意,你可以给里面的最小高度。
lazy var littleVstack:UIStackView =
let view = UIStackView(arrangedSubviews: [table,image])
view.translatesAutoresizingMaskIntoConstraints = false
view.axis = .vertical
view.arrangedSubviews[0].heightAnchor.constraint(equalToConstant: 200).isActive = true
return view
()
加上表格视图无响应。
tableView.isUserInteractionEnabled = false
【讨论】:
【参考方案2】:我建议如下:
为表格视图添加高度限制。 将其常量设置为使其在情节提要上合理可见的任何值。 将高度限制连接到插座。 每次在表格视图上重新加载数据时,都会更改高度常量。
您可能还想通过将表格视图的 Inset 添加到内容大小来考虑它。
代码示例:
CGFloat height = myTableView.collectionViewLayout. contentSize.height
heightConstraint.constant = height
self.view.setNeedsLayout() Or self.view.layoutIfNeeded()
【讨论】:
以上是关于如何将 UITableView 的高度调整为内容大小的高度?的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 标题部分的高度不会为自定义 UIView() 类自动调整
使用 Auto Layout 将 UITableView 的高度设置为其内容的高度