如何为UITableView的不同行设置不同的高度

时间:2014-07-28 06:30:23

标签: ios objective-c uitableview uitextview

如何在ios中为不同的自定义ui表格视图单元格设置不同的高度? 我试图改变高度取决于我的uitextview中有多少行,这是在我的自定义uitableview单元格内。

我尝试在我的heightForRowAtIndexPath方法中设置这样的高度,但它崩溃了:

PostStreamCell *cell = [tableView cellForRowAtIndexPath:indexPath];
int lines = cell.txtViewMessage.contentSize.height / cell.txtViewMessage.font.lineHeight;

if(lines < 4)
{
    return 100;
}
else if(lines == 4)
{
    return 100;
}
else{
    return 220;
}

4 个答案:

答案 0 :(得分:1)

您无法在cellForRowAtIndexPath 中使用heightForRowAtIndexPath,因为该单元格不存在。您必须通过其他方式检索文本而不使用单元格。

答案 1 :(得分:0)

尝试使用text boundingRectWithSize..计算单元格本身的大小。

这样的事情:

 NSString *text = yourTextView.text;
    CGSize size;

    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:@"Helvetica Neue" size:19], NSFontAttributeName,
                                          nil];
    CGRect fontSizeFor7 = [text boundingRectWithSize:CGSizeMake(525, 500)
                                             options:NSStringDrawingUsesLineFragmentOrigin
                                          attributes:attributesDictionary
                                             context:nil];
    size = fontSizeFor7.size;

    return size.height +40;

答案 2 :(得分:0)

我建议你数数         int行 在         viewDidLoad中 使用文本字段长度的方法。然后将它存储在某个数组中并在其中使用它的值         heightForRowAtIndexPath 方法。看起来应该是这样的

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (myLinesArray[indexPath.row] =< 4)
{
    return 100;
}
else return 220;
}

答案 3 :(得分:-1)

您正在正确设置高度 - 但是,您可能无法通过调用heightForRowAtIndexPath来检索cellForRowAtIndexPath中的单元格,除非您的单元格已经静态创建。 heightForRowAtIndexPath(下面)的简单实现不会崩溃,因此问题可能在视图控制器实现的其他地方或其他地方。

还注意到您要除以动态值以获得高度。检查PostStreamCell - 如果单元格对象txtViewMessage或其font属性为零,那么您将除以0,这可能导致崩溃。

    //Very simple implementation to demo changes in height
    - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row % 2) {
            return 60;
        } else {
            return 44;
        }
    }