首次加载表格视图时,所有可见单元格都是estimatedRowHeight。当我向下滚动时,单元格会自动调整大小,当我向上滚动时,最初估计的单元格会自动调整大小。
一旦细胞自动调整大小,它们似乎永远不会再回到估计的高度。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
self.tableView.estimatedRowHeight = 80.0
self.tableView.rowHeight = UITableViewAutomaticDimension
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
和
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as CustomTableViewCell
// Configure the cell...
let restaurant = restaurants[indexPath.row]
cell.namelabel.text = restaurant.name
cell.locationlabel.text = restaurant.location
cell.typelabel.text = restaurant.type
cell.thumbnailImageView.image = UIImage(named: restaurant.image)
cell.thumbnailImageView.layer.cornerRadius = cell.thumbnailImageView.frame.size.width / 2
cell.thumbnailImageView.clipsToBounds = true
cell.accessoryType = restaurant.isVisited ? .Checkmark : .None
return cell
}
关于如何让细胞最初自动调整的想法?
更新:从Xcode 7 beta 6开始,这不再是一个问题
答案 0 :(得分:26)
在加载表后,只需调用“reloadSections”:
self.tableView.reloadSections(NSIndexSet(indexesInRange: NSMakeRange(0, self.tableView.numberOfSections())), withRowAnimation: .None)
或者在Swift 3中:
let range = Range(uncheckedBounds: (lower: 0, upper: self.tableView.numberOfSections))
self.tableView.reloadSections(IndexSet(integersIn: range), with: .none)
答案 1 :(得分:8)
我遇到了同样的问题,发现附件 cell.accessoryType
会因为None
而自动调整大小,所以它似乎是Xcode中的一个错误在这一刻。
但正如@Blankarsch所说,如果您需要配件,调用reloadSections(..)
有助于解决此问题。
答案 2 :(得分:6)
我认为here的答案副作用较少。在cell.layoutIfNeeded()
tableView:cellForRowAtIndexPath:
我也正在做@nosov建议的良好做法,但是如果他们需要同时进行测试,我们就不会进行测试。
答案 3 :(得分:5)
像这样覆盖estimatedHeightForRowAtIndexPath
(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
并检查CustomTableViewCell视图中的autoLayout约束。
答案 4 :(得分:1)
请确保您的标签没有在Interface Builder中设置明确的内容大小。它们必须是自动的,如下面的屏幕截图所示,自动行高可以正常工作,而无需预先重新加载任何部分。
答案 5 :(得分:1)
如果您根据单元格本身(而不是单元格内容视图)设置约束,则表格无法获得正确的大小。因此,要解决此问题,必须将约束设置为内容视图。
但是,当您的单元支持带/不带附件视图的配置时,这就是问题。在这种情况下,根据附件视图调整内容视图的大小,结果可能不是用户期望的结果。因此,在这种情况下,解决方案是设置2个约束,一个到单元格,第二个具有较低优先级到单元格内容视图。
答案 6 :(得分:0)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
在函数中设置具有首选内容的单元格,以便UITableViewAutomaticDimension可以完美地工作。
问题是由于单元格内容已加载到其他某个委托功能中引起的,因此您可以看到单元格会自动调整为所需的大小。
答案 7 :(得分:0)
确保在tableView:cellForRowAt:
中初始化您的单元格。当我在tableView:willDisplay:forRowAt:
答案 8 :(得分:0)
对我来说,使用willDisplay单元格设置标签文本
时,我只会遇到此问题如果我在cellForRowAt索引路径中设置我的标签文本,一切都很好
答案 9 :(得分:0)