动态 UITableViewCell 高度不起作用

Posted

技术标签:

【中文标题】动态 UITableViewCell 高度不起作用【英文标题】:Dynamic UITableViewCell height not working 【发布时间】:2016-10-30 12:06:35 【问题描述】:

(带有情节提要的 ios 8) 我的 tableView 上有一个正确的细节 UITableViewCell。

在故事板中,Title 和 Right Detail 标签设置为 numberoflines = 0

我的代码:

- (void)viewDidLoad 
    [super viewDidLoad];
    keyArray = [[NSMutableArray alloc]init];
    self.table.estimatedRowHeight = 140.0;
    self.table.rowHeight = UITableViewAutomaticDimension;
    [spinner startAnimating];
    [self cleanJson:prunedDictionary];



- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return UITableViewAutomaticDimension;


- (CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
    return UITableViewAutomaticDimension;


在 cleanJson 结束时,我运行 [self.table reloadData]。 TableViewCell 确实会调整大小,但它们都会调整为相同的大小,并且看起来像是默认大小。 (我知道它们调整大小的原因是因为在 Storyboard 中我将高度设置为 200,并且在应用运行时它们都被调整为更小的尺寸)

为什么他们没有正确调整大小?

【问题讨论】:

您的约束可能是错误的。你能以某种方式将它们添加到你的问题中吗? @d.felber 没有限制,因为正如我提到的,它不是自定义单元格。因此,据我所知,它已经有限制 【参考方案1】:

问题在于您使用的是内置单元格类型以及内置标题和详细信息标签。这些细胞类型不是自我调整大小的。

您必须使用自定义单元格并自行设计,并使用从内向外调整单元格大小的约束。

【讨论】:

【参考方案2】:

您不需要这两种委托方法中的任何一种。单元格没有正确调整大小,因为您的自动布局约束设置不正确。检查这些约束并确保至少存在一个从上到下的约束视图路径。我的意思是,您可以从单元格本身的顶部逻辑上跳..通过所有视图和垂直约束,然后向下跳到底部。

像这样:

超级视图的顶部

边距约束

查看

边距约束

.

.

.

.

查看

边距约束

超级视图的底部。

介于两者之间的视图必须限制为固定大小......或者它们必须能够根据其内容调整大小。很明显,最终高度是所有这些边距和视图高度的组合。

这是一个线性函数

finalheight = topmargin + viewHeight + margin + viewHieght..etc....etc..bottommargin 

【讨论】:

这不是自定义单元格。所以我相信已经设置了约束 你能证实它是真的吗?假设是调试中最大的敌人。 它不是自定义单元格?我可以验证是的。该自定义单元格不需要约束。几乎是积极的。 约束已经到位并且有效。相信任何人,当然不相信 UIKit。您可以使用实时视图调试器。【参考方案3】:

实际上有一种方法 - 但我更喜欢创建自定义 UITableViewCell

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    let cell = self.tableView(tableView, cellForRowAt: indexPath)
    let targetSize = CGSize(width: self.tableView.bounds.width, height: CGFloat.infinity)

    return cell.systemLayoutSizeFitting(targetSize,
                                        withHorizontalFittingPriority: 1000,
                                        verticalFittingPriority: 900).height

【讨论】:

现在不行Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSLayoutConstraint constant is not finite! That's illegal. constant:inf

以上是关于动态 UITableViewCell 高度不起作用的主要内容,如果未能解决你的问题,请参考以下文章

文本为空字符串时,自动布局UILabel的动态高度计算不起作用?

更改 tableView 单元格的高度不起作用

UITableViewCell 自动调整高度不起作用

UITableViewCell 高度自动布局在 iOS 10 上不起作用

UITableViewCell 样式字幕多行不起作用

自动布局以动态调整 UILabel 大小不起作用