【问题标题】:UITableView deciding individual row heightUITableView 决定单个行高
【发布时间】:2013-08-02 02:15:41
【问题描述】:

我有一个带有自定义标题部分和单元格的表格视图。我已经创建了我的模型,现在模型保留了对剖面视图标题的引用,这是“糟糕”的设计,但我实际上只是遵循了苹果的示例代码。好吧,我的单元格有一个标签,可以保存多行数据,因此应该调整它的大小,以便每一行都可见。我想这将是控制器的工作,heightForRowAtIndexPath 对吗?事实上,从那里检索单元格并从那里获取它的高度并不难。但是,这是不可能的,因为尚未创建单元格。 (如果我错了,请纠正我)

我能想到的唯一方法是在我的模型中引用单元格,是的,我知道,坏公民。但是这样我就可以很容易地得到我需要的高度。

另一种方法是创建一个使用 sizeWithAttributes: 计算高度的方法,但这似乎是一个糟糕的设计,因为我不应该知道我的视图外观。

我在这里监督一些基本的事情吗?或者它就是这样。

我没有附加任何代码,因为我不知道您想要什么,但请随时要求我插入一些内容。

【问题讨论】:

    标签: ios uitableview model-view-controller uikit


    【解决方案1】:

    您不需要调用 cellForRowAtIndexPath 来获得指定的结果。 我相信您正在使用 array字典数组 来保存内容,

    设数组为

       NSArray *arrData = [[NSArray alloc]init];
    

    现在,在

    **heightForRowAtIndexPath**
    {
       if ( [[arrData objectAtIndex:indexPath.row].length] < 30 )
         return 40;  // Initial height
       else    if ( [[arrData objectAtIndex:indexPath.row].length] > 30 )
         return 60;   // Or any other value as per your need
    
    }
    

    这将调整单元格的高度,具体取决于该单元格内字符串的长度。 并且,在 cellForRowAtIndexPath 使用

    [cell.lblText setFrame:CGRectMake(0,0,cell.frame.size.width, cell.frame.size.height)];
    

    // 如果你想让它更有活力

    heightForRowAtIndex 中写入

    {
     int _iCount = [[self.arrData objectAtIndex:indexPath.row].length] % 40;
    
    if ( _iCount == 0 )
    return 40;
    else
     return 40*_iCount;
    }
    

    这样就解决了。

    【讨论】:

    • 那么是否有一种“真实”的方法来计算该特定字符串的高度。我知道我可以使用 sizeWithAttributes: (sizeWithFont 已被弃用),并将字体设置为属性。但是假设我使用未知字体,那么我将如何计算高度?我认为您的逻辑是有效的,但在实践中不起作用。如果您能回答此评论,您将节省我的时间:) 也感谢您的回答。非常感谢
    • 在这种情况下发生的情况是,高度会根据字体大小和标签的行数自动计算,在这种情况下是根据单元格的宽度或 uilabel 计算的.所以,你可以只计算字符串的长度,其余的都是固定的。
    • 我不明白。无论如何,您都返回40?那不会使单元格的高度始终为 40 吗?。
    • 我看到了您的编辑。但它不会导致无穷无尽的嵌套 if 语句。我的意思是,文本标签的长度可以是从 0 到 1000000 行的所有内容(只是假设)
    • 不需要那么长。我建议你在单元格上使用 UILabel 。编辑答案中的部分..检查,..
    【解决方案2】:

    我认为在调用 heightForRowAtIndexPath 时已经创建了单元格。因此,在该方法中,您可以获取单元格,计算标签的高度并返回 tableviewCell 的正确高度。

    【讨论】:

    • 问题是,在 heightForRowAtIndexPath: 内调用 cellForRowAtIndexPath: 会导致崩溃。
    猜你喜欢
    • 2013-07-17
    • 2017-01-17
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多