3

我有一个tableview但没有一个单元格显示更长的文本。更奇怪的是,它似乎并不是他们停下来的设定值。有些单元格在被截断之前显示的文本比其他单元格多。NSLog()确认字符串设置正确。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //code for getting string removed for readability

    // Identifier for retrieving reusable cells.
    static NSString *cellIdentifier = @"MyCellIdentifier";

    // Attempt to request the reusable cell.
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    // No cell available - create one.
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

        // format it
        cell.textLabel.numberOfLines = 0;           
        cell.textLabel.font = [UIFont systemFontOfSize:12.0]; 
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    }

    // Set the text of the cell to the row index.
    cell.textLabel.text = fulltext;

    return cell;
}

我的印象是numberOfLines函数0会处理它,但所有单元格都在 2 行,仅此而已。我怎样才能让它们根据需要调整到尽可能多的行?谢谢。

4

3 回答 3

1

我建议继承 UITableViewCell。不要对 cellForRowAtIndexPath 进行太多更改,但是

cell = [[MyVeryOwnTableCell alloc] initWithStyle:UITableViewCellStyleDefault 
reuseIdentifier:cellIdentifier];

假设您的子类UITableViewCellMyVeryOwnTableCell.

在 MyVeryOwnTableCell 的实现中,您应该覆盖 layoutSubViews 方法。首先调用[super layoutSubViews],然后相应地重新排列 textLabel 的框架。您可能不需要更改位置,但需要更改高度和 numberOfLines。另外,您可能需要设置适当的 lineBreakMode。有关详细信息,请参阅文档。 http://developer.apple.com/library/ios/#documentation/uikit/reference/UILabel_Class/Reference/UILabel.html

按照此模式计算文本的大小:

CGSize textSize;
textSize = [textLabel.text sizeWithFont:... constraintToSize:
CGSizeMake(300.0f, 10000.0f) lineBreakMode: ...];

您在单元格实现的 layoutSubViews 中执行此操作,如果单元格的总大小太小,您可能必须以类似的方式使用它,如果您必须覆盖 heightForRowAtIndexPath。

这里的诀窍是,在开始时,您会在 UILabel 的宽度上精确地给出尺寸限制(因此 300.0 可能不适合您)加上或多或少的无限高度。您将返回文本要求的实际大小(在这种情况下最多为 10000)。然后使用该高度/大小分别设置标签的实际大小,以根据需要计算单元格的总高度,以显示文本和可能的其他附加项目。

例子:

textLabel setFrame:CGRectMake(10.0f, 10.0f, 300.0f, textSize.height);

关于300.0f。如果您仍想使用 UITableViewCell 的自动布局功能(在设置图像时动态重新对齐标签),请将其替换为 textLabel.frame.size.width。

于 2013-01-12T21:32:59.310 回答
0

我认为为了让它显示更多的线条,你必须调整 cell.textlabel 和单元格本身的框架大小。您必须使它们的框架尺寸更高以适应新文本。如果只有两行文本适合,那就是它要显示的全部内容。您必须根据所需的线条以编程方式调整高度。

这是一个人的链接,他展示了如何根据行数使帧大小动态化。

于 2013-01-12T21:23:21.160 回答
0

您必须在运行时通过计算单元格标签 wrt 字符串的高度来调整每行的高度。

以下函数给出了你的标签大小,表格视图单元格的宽度固定

-  (CGSize) calculateLabelHeightWith:(CGFloat)width text:(NSString*)textString
{
    CGSize maximumSize = CGSizeMake(width, 9999);
    CGSize size = [textString sizeWithFont:[UIFont fontWithName:@"HelveticaNeue-Medium" size:14]
                         constrainedToSize:maximumSize 
                             lineBreakMode:UILineBreakModeWordWrap];
    return size;
} 

使用表格单元格高度委托方法

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Get String for corresponding Row
    NSString *stringObject=fullText;
     //here i ave taken row width 320
    CGSize rowSize=[Utils calculateLabelHeightWith:320 text:stringObject];

    return (rowSize.height+20); 
}

如果在创建行时动态调整行高度,它将首先调整其高度。

我希望这能解决你的问题。

于 2013-01-12T21:33:57.170 回答