根据字符串的大小设置行高?

时间:2012-10-20 12:04:16

标签: iphone ios ipad

我有一个应用程序,我想根据收到的消息字符串的内容更改单元格的高度。我在表视图的side hieghtforrow委托方法中这样做。

int rowHeight =0.0f;

     UITableViewCell *cell = [ self.mtableview cellForRowAtIndexPath:indexPath.row];

    CGSize size = [cell.textLabel.text  sizeWithFont:[UIFont systemFontOfSize:13.0f] constrainedToSize:CGSizeMake(300, 5000) lineBreakMode:UILineBreakModeWordWrap];// calculate the height 

    rowHeight = size.height+10; // I use 10.0f pixel extra because depend on font

    return rowHeight;

但它没有在我的应用程序中崩溃。任何人都可以看看这个吗?

2 个答案:

答案 0 :(得分:1)

我希望看到您的cellForRowAtIndexPath方法,以了解您如何检索标签的文字。

您在调用sizeWithFont时走在正确的轨道上,但您需要两件事才能成功确定:

  1. 标签的字体大小(您在13.0处硬编码)
  2. 用于确定(您试图从UILabel中提取)的大小的文本
  3. (在13.0的代码中硬编码字体大小不一定是个好主意,因为如果你想为单元格更改它,你需要记住在heightForRowAtIndexPath和其他任何地方更改它,但那是一个不同的问题)。

    不是从UILabel本身拉出标签的文本,而是从最初生成/包含文本的任何数据结构中确定文本。这就是为什么看到你的cellForRowAtIndexPath方法会有所帮助。

    请勿从cellForRowAtIndexPath拨打heightForRowAtIndexPath,这些方法不应该以这种方式使用。

    这是一个简单的示例,我可以在您发布cellForRowAtIndexPath代码时进行优化:

    //ASSUME that self.arrayOfStrings is your data structure where you are retrieving the label's text for each row.
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        int rowHeight =0.0f;
        NSString *stringToSize = [self.arrayOfStrings objectAtIndexPath:indexPath.row];
        CGSize size = [stringToSize  sizeWithFont:[UIFont systemFontOfSize:13.0f] constrainedToSize:CGSizeMake(300, 5000) lineBreakMode:UILineBreakModeWordWrap];
        rowHeight = size.height+10;
        return rowHeight;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell"; 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        cell.textLabel.text = [self.arrayOfStrings objectAtIndexPath:indexPath.row];
        return cell;
    }
    

答案 1 :(得分:0)

从代码中删除UITableViewCell *cell = [ self.mtableview cellForRowAtIndexPath:indexPath.row]; 。您不需要在HeightForRowat方法中添加单元格。