4

我的 custom 有问题UITableView。我想知道如何正确地将一组文本放入单元格中而不会看到任何省略号“...”并且文本不会在单元格末尾被截断。

这是我的细胞的样子,目前:

在此处输入图像描述

它是UISplitViewController. 这样做的问题是,之前由于某种原因它会显示文本的整个长度,但它会到达单元格的末尾并且字符串的其余部分被切断(当我检查“AutoLayout”时会发生这种情况)。

这是我的代码目前的样子:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"BCell";

    BracketTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[BracketTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell.description setLineBreakMode:NSLineBreakByWordWrapping];
        cell.description.numberOfLines = 0;
        cell.description.font = [UIFont fontWithName:@"Helvetica" size:14.0];
    }

    Bracket *bracket = [brackets objectAtIndex:indexPath.row];

    [cell.description setText:bracket.name];
    [cell.bracketId setText:[NSString stringWithFormat:@"%@", bracket.bracketId]];    

    return cell;
}

我正在尝试高度,但这似乎并不重要,因为我可以将高度设置为任何值,但它仍然显示截断的文本。

谢谢!

4

4 回答 4

1

通常,我支持可变高度单元的方法是定义一个类方法,该方法可以计算给定模型对象的大小:

+ (CGFloat)heightForBracket:(Bracket*)bracket;

使其成为类方法的美妙之处在于,您可以与实际实现布局的代码共享常量(填充值、字体大小、缩进级别等),而无需将它们暴露给任何其他类。如果您想在将来更改这些常量,您只需在单元子类中的一处进行更改。一个示例子类实现:

#define kPaddingHorizontal 10.0
#define kPaddingVertical 10.0
#define kFontSizeName 17.0

+ (CGFloat)heightForBracket:(Bracket*)bracket {
    // determine the dimensions of the name
    UIFont *nameFont = [UIFont systemFontOfSize:kFontSizeName];
    CGFloat nameSize = [bracket.name sizeWithFont:nameFont
                                constrainedToSize:CGSizeMake(300, CGFLOAT_MAX) // 300 is the width of your eventual label
                                    lineBreakMode:NSLineBreakByWordWrapping];

    // Apple recommends all cells be at least 44px tall, so we enforce a minimum here
    return MAX(44, nameSize.height + 20 + kPaddingVertical*2); // 20 is space for the subtitle label
}

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];

    if (self) {
        // bracket name
        self.textLabel.numberOfLines = 0; // 0 makes this variable height
        self.textLabel.font = [UIFont systemFontOfSize:kFontSizeName];
        self.textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self.textLabel.backgroundColor = [UIColor clearColor];
        // if you wanted to hardcode a specific width, to a subview do it here as a constant and then share it with heightForBracket:

        // bracket number
        self.detailTextLabel.numberOfLines = 1;
        self.detailTextLabel.font = [UIFont systemFontOfSize:14.0];
        self.detailTextLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self.detailTextLabel.backgroundColor = [UIColor clearColor];
    }

    return self;
}

- (void)setBracket:(Bracket*)bracket {
    _bracket = bracket;

    self.textLabel.text = bracket.name;
    self.detailTextLabel.text = [NSString stringWithFormat:@"%@", bracket.bracketId];
}

然后您可以heightForBracket:致电tableView:heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    Bracket *bracket = [brackets objectAtIndex:indexPath.row];

    return [BracketTableCell heightForBracket:bracket];
}

tableView:cellForRowAtIndexPath:变得非常简单,只需在单元格上设置适当的括号:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"BCell";
    BracketTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[BracketTableCell alloc] initWithReuseIdentifier:CellIdentifier];
    }

    Bracket *bracket = [brackets objectAtIndex:indexPath.row];
    cell.bracket = bracket;  

    return cell;
}

几点注意事项:

  • 这假设单元格没有使用自动布局
  • 这明确硬编码单元格/标签的宽度,可能适合也可能不适合您的用例
  • 你永远不应该命名一个属性description,因为这是协议中已经存在的方法NSObject
  • 其他增强功能将缓存结果heightForBracket:以提高滚动性能,特别是如果您开始为大量子视图执行大小调整逻辑
于 2013-05-05T04:24:33.310 回答
0

@gdubs 你可以使用自定义 UITableViewCells

作为参考,您可以使用为 UITableView 自定义表格视图单元格

我想那时你自定义 UILabel 会很容易。就像如果你想添加多行然后设置TitletLabel.numberOfLines=0;,如果你想要 wordwrapping TitleLabel.lineBreakMode=NSLineBreakByWordWrapping;。自动换行还有其他选项。

于 2013-04-29T17:39:51.100 回答
0

使用标签和自动布局的关键是在preferredMaxLayoutWidth标签上设置属性。没有这个标签就不能正确包装(或者在某些情况下,这就是你以前看到的,我想?)。

将该值设置为最大线宽,然后标签应该可以正常工作。

于 2013-04-29T18:26:13.443 回答
0

我认为问题与标签的宽度有关,如果您使用自动布局扩展标签的宽度以填充父单元格并添加尾随和导致超级视图约束,以便它调整大小。

于 2013-05-03T22:52:38.090 回答