使用iOS 7中的UITableViewCellStyleSubtitle为UItableViewCell获取适当的高度

时间:2014-01-15 13:29:26

标签: ios objective-c uitableview

我想为我的单元格获得动态高度,有时会有一行,两行三行文本。问题是,这个函数(来自http://www.raywenderlich.com):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static UILabel* labelTitle;

    if (!labelTitle) {
       labelTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, FLT_MAX, FLT_MAX)];
       labelTitle.text = @"test";
    }

    labelTitle.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];

    [labelTitle sizeToFit];

    return labelTitle.frame.size.height * 1.7;
}

它获得适合所有细胞的静态高度。我想要一个动态高度取决于UILabels中的内容。以及如何使用UITableViewCellStyleSubtitle实现这一目标?

4 个答案:

答案 0 :(得分:0)

要使sizeToFit正常工作,您必须将标签的行设置为0;

// width of the testlabel should be same for the label you are using to show in Cell
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(x,y,width,height)];
testLabel.numberOfLines = 0; // you need to do this
testLabel.text = @" Your text here ";
[testLabel sizeToFit];

现在您可以使用标签的高度。

CGFLoat height = testLabel.frame.size.height + margin; // add margin if you want a float value

还要确保在 - (UITableViewCell *)tableView中使用sizeToFit :( UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

希望这会对你有所帮助。 :)

答案 1 :(得分:0)

从文档中,较大的文本标签通过textLabel属性访问,较小的文本标签通过detailTextLabel属性访问。

所以可能是这样的:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static UITableViewCell *cell;
    static UILabel *label;

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Your Identifier"];
        cell.frame = CGRectMake(0, 0, tableView.bounds.size.width, 100);
        label = cell.detailTextLabel;
    }

    CGSize size = [label sizeThatFits:CGSizeMake(label.bounds.size.width, CGFLOAT_MAX)];
    return size.height;
}

或者,自己继承UITableViewCell,然后在那里绘制文本。 Cell代码将是这样的:

@interface YourCell : UITableViewCell
    @property (nonatomic, strong) NSString *text;
    + (CGFloat) heightForCellWithText:(NSString *)text;
@end

单元格实施:

#import "YourCell.h"

@interface YourCell()

@end

static NSMutableParagraphStyle *textStyle;
static UIFont *textFont;

@implementation YourCell

+(void)initialize {
    textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    textStyle.lineBreakMode = NSLineBreakByWordWrapping;
    textStyle.alignment = NSTextAlignmentLeft;

    textFont = [UIFont systemFontOfSize:12];
}

-(void)setText:(NSString *)text {
    _text = text;
    [self setNeedsDisplay];
}

#define TEXT_ORIGIN_X 20
#define TEXT_ORIGIN_Y 20
#define TEXT_SIZE_WIDTH 200

#define CELL_MARGIN TEXT_ORIGIN_X * 2

+ (CGFloat) heightForCellWithText:(NSString *)text {
    return [self heightForText:text] + CELL_MARGIN;
}

+ (CGFloat )heightForText:(NSString *)text {
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    context.minimumScaleFactor = 1;
    return [text boundingRectWithSize:CGSizeMake(TEXT_ORIGIN_X, CGFLOAT_MAX)
                          options:NSStringDrawingUsesLineFragmentOrigin
                       attributes:@{
                                    NSFontAttributeName: textFont, NSParagraphStyleAttributeName:textStyle
                                    } context:context].size.height;
}

-(void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    [self.text drawInRect:CGRectMake(TEXT_ORIGIN_X, TEXT_ORIGIN_Y, TEXT_SIZE_WIDTH, [self.class heightForText:self.text]) withAttributes:@{NSFontAttributeName:textFont, NSParagraphStyleAttributeName:textStyle}];
}

@end

您的细胞高度计算将

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [YourCell heightForCellWithText:@"Test"];
}

答案 2 :(得分:0)

调整方法(sizeWithFontsizeToFit)在iOS7上非常容易出错。 我建议使用sizeThatFits。当我使用它时,它并不完美,如果最后一行只有一个单词,它会切断最后一行:为了克服这个问题,你应该减少它的最大宽度参数,同时你的UI字段的框架保持不变。

答案 3 :(得分:0)

当为所述单元格调用layoutSubviews时,每个单元格都会获得适当的大小。遗憾的是,在创建单元格时不会调用它。

您可以使用稍微延迟setNeedsLayout的单元格来重新布局,这样您就可以获得合适的尺寸。