0

我有一个字幕样式 UITableViewCell,它的高度会根据每个字段的文本长度动态变化。问题是如果标签有多行,则 textLabel 的高度(CGSize 大小)不会增加。

http://s10.postimg.org/6urher7s9/text_Label.png

奇怪的是,detailTextLabel 的高度正在增加(CGSize size2)。计算两个高度的代码是相同的。

http://s21.postimg.org/m0af4gyw7/detail.png

这是我的功能:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    SETLISTFMNS0Song *song = [[[selectedSetlist.sets objectAtIndex:indexPath.section] songs]objectAtIndex:indexPath.row];
    CGSize size = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
    NSLog(@"Label: \"%@\" \tLabel Size: %f W %f H", song.name, size.width, size.height);

    NSMutableString *detail;
    if ([song cover]) {
        detail = [[NSMutableString alloc] initWithFormat:@"(%@ cover)", [[song cover] name]];
    }
    if ([song with]) {
        if (!detail) {
            detail = [[NSMutableString alloc] initWithFormat:@"(with %@)", [[song with] name]];
        }
        else {
            [detail appendFormat:@" (with %@)", [[song with] name]];
        }
    }
    if ([song info]) {
        if (!detail) {
            detail = [[NSMutableString alloc] initWithFormat:@"(%@)", [song info]];
        }
        else {
            [detail appendFormat:@" (%@)", [song info]];
        }
    }

    if (detail.length != 0) {
        CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
        size.height += size2.height;
        NSLog(@"Detail Label: \"%@\" \tDetail Label Size: %f W %f H", detail, size2.width, size2.height);
    }

    return size.height + 5;
}

我还在 cellForRowAtIndexPath 中将 textLabel 的 numberOfLines 属性设置为 0 以支持多行:

cell.textLabel.numberOfLines = 0;
cell.detailTextLabel.numberOfLines = 0;

更新:感谢@josh,我现在明白为什么会这样了。我将宽度约束设置为 UITableView 的宽度,它太宽了。任何人都知道如何在创建 UILabel 之前找到它的宽度?哈!

谢谢!

4

2 回答 2

1

您计算大小的字符串有多长?我问是因为您的sizeWithFont:constrainedToSize:功能限制在单元格的全宽,但您的标签可能不是单元格的全宽。

我怀疑正在发生的事情song.info只是足够短,如果线条是单元格的全宽,它可以放在一条线上,并且你的歌曲detail足够长,它可以计算正确的行数,但不是那么长超过计算高度。

综上所述,我认为您需要做的是找出宽度textLabel并将detailTextLabel您的约束设置为这些值。

更新 - 一种计算标签宽度的方法

由于单元格内标签的宽度取决于单元格的宽度,并且由于当时并未创建单元格heightForRowAtIndexPath:,因此我们需要想出一种方法来在标签宽度之前知道它们的宽度被设置。唯一的方法是自己设置宽度。这是我的做法:

MyCell.h

#import <UIKit/UIKit.h>

@interface MyCell : UITableViewCell

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth;

@end

我的细胞

#import "MyCell.h"

@implementation MyCell

- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect frame = self.textLabel.frame;
    frame.size.width = [MyCell textLabelWidthForCellOfWidth:self.frame.size.width];
    self.textLabel.frame = frame;
}

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth {
    // This calculation can be as complex as necessary to account for all elements that affect the label
    return cellWidth - 20;
}

@end

然后在您的heightForRowAtIndexPath:实现中,您可以调用相同的类方法:

CGFloat labelWidth = [MyCell textLabelWidthForCellOfWidth:self.tableView.frame.size.width]; // Since non-grouped cells are the full width of the tableView
CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(labelWidth, CGFLOAT_MAX)];

您将为需要引用的每个标签创建一个单独的类方法 (+)。

于 2013-03-27T09:15:37.793 回答
0

在查看您的代码时,我发现您缺少定义“lineBreakMode”。

CGSize theSize = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

用这个更新你的代码。我希望它能解决你的问题。祝你好运

于 2013-03-27T17:42:13.337 回答