我尝试为动态内容设置单元格高度。在单元格中我使用两个UILabel,但我无法从tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath)
访问单元格。由于tableview显示img中有单元格,但是当我在模拟器中运行应用程序时print("Cell geted")
输出没有任何内容。 我只是IOS开发的初学者,所以我的应用程序中可能有一些错误的配置。我想知道可能导致这个原因的原因
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = self.tableView.cellForRow(at: indexPath) as? ArticleTableViewCell
if(cell != nil) {
print("Cell geted")
}
return 120
}
我使用xib文件来定义单元格
Comtum cell class如下
import UIKit
class ArticleTableViewCell: UITableViewCell {
@IBOutlet weak var time: UILabel!
@IBOutlet weak var digest: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
time.layer.borderWidth = 1
//time.layer.masksToBounds = true
time.layer.cornerRadius = 10
time.backgroundColor = UIColor.cyan
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
和storyboard xib文件如下
答案 0 :(得分:3)
您必须提供数据的高度(通过计算您的数据所具有的任何度量),您无法使用该委托方法访问单元格。
答案 1 :(得分:3)
在heightForRow
中,您应该返回UITableViewAutomaticDimension
。如果您这样做,那么当tableView
从cellForRowAt
获取单元格时,viewDidLoad
会自动使用自动布局。
简而言之:
在tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
设置中:
However, make sure that you read [this article][1] and also [this article on autolayout][4].
在单元格中设置自动布局,以便单元格可以根据其内容确定自己的大小。
要使用自动布局在xib单元格中设置单元格设计,请阅读this article。在您的情况下,您可以执行以下操作:
首先,单击标签将其选中。然后点击"添加新约束"右下角的图标,请参见下一张图片:
一个小弹出窗口显示,设置常量定义标签应该约束的单元格的顶部,左侧,底部和右侧的距离。确保表示激活约束的红线全线(一旦填充常量,它们应该从虚线变为完整)。首先尝试为每个方向设置8,稍后您可以使用它。
cellForRowAt
didSelect
中返回一个单元格即可。 TableView将使用单元格的自动布局来确定其高度。有关详细信息,请参阅this answer或我的other answer for an example in code。
修改强>
要根据行数使单元格可扩展,请在tableView
中将标签的行数设置为0,并使用以下方法告诉func refreshTableAfterCellExpansion() {
self.tableView.beginUpdates()
self.tableView.setNeedsDisplay()
self.tableView.endUpdates()
}
重绘自身:
didDeselect
在buildscript {
repositories {
mavenCentral()
jcenter()
}
}
repositories {
mavenCentral()
jcenter {
url "http://jcenter.bintray.com/"
}
}
dependencies {
compile 'org.lognet:grpc-spring-boot-starter:2.1.4' // change with latest
中执行相同的操作,只是颠倒过来。
答案 2 :(得分:3)
设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。
UITableViewAutomaticDimension
分配给rowHeight& estimatedRowHeight heightForRowAt
并向其返回值UITableViewAutomaticDimension
)-
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
用于UITableviewCell中的标签实例
注意:如果您有多个动态长度的标签(UIElements),应根据其内容大小进行调整:调整内容拥抱和压缩阻力优先级`对于要以更高优先级扩展/压缩的标签。
在这个例子中,我设置了低拥抱和高压缩阻力优先级,这导致为第二(黄色)标签的内容设置更多优先级/重要性。