gpt4 book ai didi

ios - 根据 x 可见单元格的单元格高度设置表格 View 高度

转载 作者:行者123 更新时间:2023-11-30 12:20:03 25 4
gpt4 key购买 nike

我想调整表格 View 高度,使其一次仅显示 x 个单元格。单元格的布局是可配置的,所以我事先不知道它的高度。

为了简单起见,我尝试设置一个最简单的单元格示例,其中包含两个标签,其中固定文本垂直堆叠。

MyCustomViewCell.swift

class MyCustomViewCell: UITableViewCell {

let label: UILabel
let label2: UILabel

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
label = UILabel()
label2 = UILabel()
super.init(style: style, reuseIdentifier: reuseIdentifier)

self.contentView.addSubview(label)
self.contentView.addSubview(label2)

label.translatesAutoresizingMaskIntoConstraints = false

label.topAnchor.constraint(equalTo: self.contentView.topAnchor).isActive = true
label.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor).isActive = true
label.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor).isActive = true

label2.translatesAutoresizingMaskIntoConstraints = false
label2.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true
label2.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor).isActive = true
label2.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor).isActive = true
label2.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor).isActive = true

label.text = "string 1"
label2.text = "string 2"
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

通过在初始化表格 View 时设置高度约束(优先级低于 1000),然后根据单元格的框架在 cellForRowAtIndexPath 上设置实际高度,我成功地实现了所需的行为我希望可见的单元格数量(在本例中为 5)。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

let cellIdentifier = "cellIdentifier"

override func viewDidLoad() {
super.viewDidLoad()

let tableView = UITableView(frame: .zero, style: .plain)
setupTableViewConstraints(tableView: tableView)

tableView.register(MyCustomViewCell.self, forCellReuseIdentifier: cellIdentifier)
tableView.dataSource = self
tableView.delegate = self
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

func setupTableViewConstraints(tableView: UITableView) {
self.view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false

tableView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true
let heightConstraint = tableView.heightAnchor.constraint(equalToConstant: 300)
heightConstraint.priority = 900
heightConstraint.isActive = true

tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10).isActive = true
tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -10).isActive = true

tableView.layer.borderColor = UIColor.black.cgColor
tableView.layer.borderWidth = 0.5
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10000
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath as IndexPath) as! MyCustomViewCell

tableView.heightAnchor.constraint(equalToConstant: cell.frame.height*5).isActive = true
return cell
}
}

但是,这种方法对我来说似乎并不合适。从设置仅稍后调整的“虚拟”高度到每次执行 cellForRowAtIndexPath 时设置表格 View 高度。

有人能给我指出一个更优雅的解决方案吗?

最佳答案

在您的示例中,每次要求您加载单元格时,您都会更新表格 View 的高度。

虽然这可行,但知道即使在单元格可见之前表格 View 也会不断调用此方法,这似乎有点矫枉过正。

为什么不等到tableview加载完成后才更新高度呢?

您可以在 willDisplayCell 中执行此操作,而仅当单元格即将显示时或可能使用完成闭包时才会触发,如下所示:

self.tableView.reloadData()
DispatchQueue.main.async {
// This closure is only called when the data has been reloaded
// and thus will enable you to calculate the final content height
}

关于ios - 根据 x 可见单元格的单元格高度设置表格 View 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44908870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com