UITableViewCell不显示全文

时间:2013-01-12 21:01:48

标签: iphone ios objective-c cocoa-touch

我有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行,不再是。如何根据需要调整它们?感谢。

3 个答案:

答案 0 :(得分:1)

我建议继承UITableViewCell。 不要对cellForRowAtIndexPath做太多改动,而是

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

假设您的UITableViewCell的子类是MyVeryOwnTableCell

在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。

答案 1 :(得分:0)

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

这是一个link给一个人,他根据行数显示如何使帧大小动态。

答案 2 :(得分:0)

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

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

-  (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); 
}

这将调整te高度,如果每次创建行时动态行,它将首先调整其高度。

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