【问题标题】:Setting variable height of a UITableViewCell based on its width - IPhone根据宽度设置 UITableViewCell 的可变高度 - iPhone
【发布时间】:2011-06-21 11:30:31
【问题描述】:

在 iPhone 的 tableview 中,内容宽度是 320 或 300,具体取决于样式。然而当 Ipad 上台时,我们开始根据我们的设计使用不同宽度的 tableview。

一个问题是,在某些情况下,我们根据其字幕文本大小来计算单元格的高度。文本高度取决于内容宽度,而单元格高度取决于文本高度。如果宽度是 300 或 320 就可以了。但是想想我使用了一个 500 像素宽的分组样式表视图,并且没有办法计算减小的内容宽度。由于这个问题,我们无法根据内容计算调用的高度。

我们可以获取有关单元格内容宽度信息的唯一位置是子类 layoutsubview 方法。然而 heightForRowAtIndexPath 在 layoutSubview 方法之前被调用,我们没有关于缩小单元格内容宽度的信息。

所以我们需要一种很好的方法来计算分组样式 tableview 单元格的真实宽度。

我会很高兴得到任何帮助。

谢谢。

M 阿里卡利斯坎

【问题讨论】:

    标签: iphone uitableview


    【解决方案1】:

    最后我解决了分组 tableView 的宽度问题。通过有趣的数学计算,标准 320 宽度的填充尺寸为 10(在一侧)根据宽度而变化。处理此数学的简单方法是根据宽度范围使用固定值。下面的代码对 4.0 有效,我没有在任何其他 iOs 版本上测试过。

    请将返回的填充大小乘以 2,以找到分组样式 tableView 的总减少量。例如,如果 320 像素宽的 tableView 的 paddign 大小为 10,则 contentWidth 为 320 - (2.10) = 300。

    CGFloat GetTableViewPaddingSize(CGFloat tableViewWidth)
    {
        if (tableViewWidth < 401) {
            return 10;
        } else if (tableViewWidth < 547) {
            return 31;
        } else if (tableViewWidth < 560) {
            return 32;
        } else if (tableViewWidth < 573) {
            return 33;
        } else if (tableViewWidth < 586) {
            return 34;
        } else if (tableViewWidth < 599) {
            return 35;
        } else if (tableViewWidth < 612) {
            return 36;
        } else if (tableViewWidth < 625) {
            return 37;
        } else if (tableViewWidth < 639) {
            return 38;
        } else if (tableViewWidth < 652) {
            return 39;
        } else if (tableViewWidth < 665) {
            return 40;
        } else if (tableViewWidth < 678) {
            return 41;
        } else if (tableViewWidth < 691) {
            return 42;
        } else if (tableViewWidth < 704) {
            return 43;
        } else if (tableViewWidth < 717) {
            return 44;
        } else {
            return 45;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我有a similar problem,即如果您有附件视图,则在调用heightForRowAtIndexPath 时不知道表格单元格内容视图的宽度。最后,除了硬编码附件视图的宽度(20px)并从通常的宽度中减去它之外,没有其他解决方案。我认为您将不得不做同样的事情——根据表格视图的整个宽度对单元格内容宽度进行硬编码。

      【讨论】:

        【解决方案3】:

        NSString UIKit 插件(发现 here)提供了许多方法来查找给定特定 UIFont 和换行模式的字符串的大小(请记住,String、UIFont 等可以来自您的模型类,所以这有所有在需要显示 UITableView 之前已知)。您可以将这些方法与您自己的个人间距/填充/等结合使用。以便在调用 heightForRowAtIndexPath: 时找出 UITableViewCell 的所需大小(因此宽度和高度)。

        只要您决定如何计算给定表格单元格的大小,然后在所有 UITableView 委托和数据源方法中保持此方法一致,那么您应该没问题。

        【讨论】:

        • 感谢您的回答,但我的问题不在于找到字符串高度的正确函数。只要我们知道它的宽度,我们就可以找到它的高度。问题是当我们使用分组表格视图时,我们不知道内容宽度,因为它被缩小了。在 Iphone 320 中减少到 300。
        • 因此,根据 tableview 样式,我们将此大小处理为硬编码。但在 Ipad 中,我们使用多种宽度的表格视图。例如,分组的 500 像素宽 tableview 的实际内容宽度是多少。减少增量并不总是 20 像素。 iOs 做了一些内部数学来计算减少增量。我只想知道任何给定的宽度。
        • 你检查过UITableViewCell的contentView的frame吗?我对分组的 TableView 单元格而不是非分组的理解是单元格的框架实际上并没有改变。
        【解决方案4】:

        正如 James 提到和解释的,你可以使用类似

        UIFont *font = [UIFont systemFontOfSize:16];    
        CGSize size = [TEXT_STRING sizeWithFont:font constrainedToSize:CGSizeMake(tableView.frame.size.width, 16*1000.f) lineBreakMode:UILineBreakModeCharacterWrap];
        return size.height;
        

        在委托heightForRowAtIndexPath:cellForRowAtIndexPath: 中使用它来返回表格单元格的高度并更新单元格框架。

        希望这可能对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-08-06
          • 1970-01-01
          • 2015-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多