3

我在 UITableViewCell 中有一个多行 UILabel。我想控制线条之间的间距,将线条压缩得更近一些。我已经读过,控制“领先”的唯一方法是使用属性字符串。所以我通过使标签属性而不是纯文本来做到这一点,然后我将 lineHeightMultiple 设置为 0.7 以压缩行:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple = 0.7;
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
paragraphStyle.alignment = NSTextAlignmentLeft;

NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"HelveticaNeue-Bold" size:15.0], NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil];

NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:@"Here is some long text that will wrap to two lines." attributes:attrs];

[cell.textLabel setAttributedText:attributedText];

问题是,现在整个标签不在 UITableViewCell 中垂直居中。

我怎样才能解决这个问题?在下面的附件中,你可以明白我的意思。“压缩”的多行 UILabel 在每一行中都比应有的更高,并且不再与右侧的箭头指示器垂直对齐。

例子

4

2 回答 2

2

行高倍数改变了所有行的行高,包括第一行,所以它在你的标签中都有一点高。你真正想要的是调整行距,所以第二行的起始基线比默认的要近一点。

尝试更换:

paragraphStyle.lineHeightMultiple = 0.7;

和:

paragraphStyle.lineSpacing = -5.0;

调整行距值以适应口味。

于 2013-02-01T19:57:38.700 回答
1

两者都UITextDrawing这样Core Text做。我认为这很奇怪..而不是使用任意值lineSpacing- 我说计算这个Core Text并计算出像这样的实际偏移量

+ (CGFloat)offsetForAttributedString:(NSAttributedString *)attributedString drawRect:(CGRect)rect
{
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect];
    CFRange fullRange = CFRangeMake(0, [attributedString length]);
    CTFramesetterRef framesetterRef = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetterRef, fullRange, path.CGPath, NULL);
    CFArrayRef lineArrayRef = CTFrameGetLines(frameRef);
    CFIndex lineCount = CFArrayGetCount(lineArrayRef);
    CGPoint lineOrigins[lineCount];
    CTFrameGetLineOrigins(frameRef, CFRangeMake(0, lineCount), lineOrigins);

    CGFloat offsetDueToLineHeight = 0.0;

    if(lineCount > 0)
    {
        CTLineRef firstLine = CFArrayGetValueAtIndex(lineArrayRef, 0);
        CGFloat ascent, descent, leading;
        CTLineGetTypographicBounds(firstLine, &ascent, &descent, &leading);
        offsetDueToLineHeight = rect.size.height - lineOrigins[0].y - ascent;
    }

    CFRelease(frameRef);
    CFRelease(framesetterRef);

    return offsetDueToLineHeight;
}

此值适用于UITextDrawingCore Text

于 2013-12-02T19:31:58.153 回答