UITableViewCell 高度基于可用屏幕空间

Posted

技术标签:

【中文标题】UITableViewCell 高度基于可用屏幕空间【英文标题】:UITableViewCell height based on available screen space 【发布时间】:2014-09-17 06:22:08 【问题描述】:

我想为我的UITableView 创建一个布局,使其分为 2 个部分: 第一部分有 3 行标准高度(44px), 第二部分有一行,其中包含一个UITextView,它完全填满了这个单元格。棘手的部分是我想将此textView 的单元格行调整为可见tableview 区域的高度,以便文本视图占据屏幕上的剩余视图。我如何找出,在

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

剩余的高度是什么样的?我之前根据两种可用的 iPhone 屏幕尺寸(480 和 568)做出了硬编码假设,但对于新的 iPhone6 和 iPhone 6+ 屏幕,我不想使用任何假设值来计算。

【问题讨论】:

不是硬编码480568 是检查self.view.bounds.size.height 不够好? 可能是这样。但是我如何从单元格的开头偏移它呢?在heightForRowAtIndexPath 中,UITableViewCell(来自 section:1 row:0)不会返回有意义的帧来确定该单元格在 tableview 中的位置(垂直) 您可以使用tableView.contentOffset.y 获取当前表滚动视图偏移量。那么这只是一个计算问题。如果您需要考虑标题高度和其他内容,您可以使用[tableView heightForHeaderInSection:] 等获取它们。如果您可以发布一些图片并提供更多详细信息,我可能会为您提供更好的帮助。 【参考方案1】:

您已经在tableView.bounds.size.height 处获得了表格视图的高度,您只需要从中减去第一部分的高度。所以

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    if (indexPath.section == 0)
    
        return 44;
    

    return tableView.bounds.size.height - 44 * 3;

根据标题的行为,您可以使用rectForHeaderInSection:rectForSection: 来获取高度

【讨论】:

部分标题也有高度,所以这将是不准确的【参考方案2】:

如果您确定永远不会更改行数,则可以从情节提要中静态执行此操作。 您可以根据需要插入任意数量的原型单元。通过自动布局或自动调整大小,您可以将单元格设置为静态或随屏幕大小而增加。

但是,如果您真的想以编程方式制作它,您可以使用self.view.bounds.size.height 撤消 3 个单元格和 2 个部分标题,剩下的是您的 UITextView 单元格。

【讨论】:

不确定如何在此处使用自动布局。我们需要根据可用空间计算 UITableViewCell 的大小。不确定自动布局如何做到这一点(除了在计算高度后在代码中设置常量,这无论如何都是问题) 您可以通过保留第一部分而不进行任何自动调整大小,并且只有动态需要它的单元格应该具有 UIViewAutoresizingFlexibleBottomMargin 和 UIViewAutoresizingFlexibleHeight

以上是关于UITableViewCell 高度基于可用屏幕空间的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设备屏幕objective-c设置UITableViewCell高度

UITableViewCell内的UICollectionView如何根据屏幕大小调整tableview单元格高度

UITableViewCell 基于百分比的高度和最小高度

自定义UITableViewCell:Cell高度分割线间距等

UITableViewCell 具有基于宽度的固有高度

如何基于多视图配置动态UITableViewCell的高度