UITableViewCell / UITableView:UITableViewCell中2个UILabel的动态调整大小正在闪烁

时间:2015-05-15 15:04:13

标签: ios uitableview swift

UITableViewCell with two Dynamic UILabels

我想在图像中显示一些这样的东西,其中两个UILabel垂直旁边的另一个根据文本进行扩展。

这就是我尝试的方式。

对于label1,我正在使用NSMutableAttributedString,以便我可以设置行间距。 Label2使用普通的String文本。

UITableView的属性

tableView.estimatedRowHeight = 110
tableView.rowHeight = UITableViewAutomaticDimension

heightForRowAtIndexPath()未实现,因为这些属性将动态处理高度

在CellForRowAtIndexPath()

var paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 15
paragraphStyle.alignment = NSTextAlignment.Right
attrString = NSMutableAttributedString(string: "HUGE TEXT 1")
attrString.addAttribute(NSParagraphStyleAttributeName,     value:paragraphStyle, range:NSMakeRange(0, attrString.length))
myCell.label1.attributedText = attrString
myCell.label2.text = "HUGE TEXT 2"

问题:当向下滚动(新单元格从下向下)没有问题时,但是当我向上滚动(新单元格从上向上)时,单元格开始闪烁,然后调整大小以适应滚动结束。闪烁仅在UILabel2上。对于这种布局,我似乎没有找到堆栈溢出的任何解决方案。

1 个答案:

答案 0 :(得分:0)

这可以帮助您在UITableViewCell中实现此方法:

+ (CGFloat) cellHeightForContent:(NSString)aContent {
    CGFloat result = 0;
    CGSize textDims = [aContent getCorrectSizeWithFont:[UIFont fontWithName:@"Helvetica" size:13] constrainedToSize:CGSizeMake(kLabelWidth, CGFLOAT_MAX)];
    result = 2 * kMarginHeight + textDims.height;

    return result;
}

此方法返回的值将用于heightForRowAtIndexPath方法。

之后,您需要在NSString类别中定义方法getCorrectSizeWithFont,如下所示:

- (CGSize)getCorrectSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    NSMutableDictionary *attrsDictionary = [NSMutableDictionary dictionaryWithObject:font forKey:NSFontAttributeName];

    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [attrsDictionary setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];

    NSMutableAttributedString* attrStrWithLinks = [[NSMutableAttributedString alloc] initWithString:self attributes:attrsDictionary];
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrStrWithLinks);
    CGSize sz = CTFramesetterSuggestFrameSizeWithConstraints(framesetter,CFRangeMake(0,0),NULL,CGSizeMake(size.width,CGFLOAT_MAX),NULL);
    if (framesetter) CFRelease(framesetter);
    return CGSizeMake(sz.width,sz.height);
}