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
将您的UITableView子类化以覆盖intrinsicContentSize为其contentSize,如下所示:
override var intrinsicContentSize: CGSize {
return contentSize
}
Run Code Online (Sandbox Code Playgroud)然后为表使用自动行高,因此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)当您从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)
更新 Swift 4 此代码运行良好
self.scrollView.layoutIfNeeded()
self.view.layoutIfNeeded()
self.tableViewHeightConstraint.constant = CGFloat(self.tableView.contentSize.height)
Run Code Online (Sandbox Code Playgroud)
您需要将 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 内容大小,并且不应引发任何警告。
| 归档时间: |
|
| 查看次数: |
13392 次 |
| 最近记录: |