iOS開発:UILabelでリッチにテキスト表示(OHAttributedLabel)で、UILabelの表示をカスタマイズしたが、気になる点が残っている。それは、行間の広さだ。

前回の結果だが、OHAttributedLabel(上)を使うと、通常のUILabel(下)よりも、行間が広くなっている。しかも、OHAttributedLabel(上)の1行目と2行目の間だけ、さらに広くなってしまっている。

原因

全体的に行間が広くなっているのは、OHAttributedLabelの問題だろう。

1行目と2行目の間が広くなっているのは、CoreTextのフォントのレンダリングの問題。日本語フォントと英字フォントの高さの違いからくるようだ。解決策も既出で助かった。

修正する

解決策があるようなので、OHAttributedLabelに組み込んでみた。NSAttributedString+Attributes.mを修正する。

[c]

-(void)setTextAlignment:(CTTextAlignment)alignment lineBreakMode:(CTLineBreakMode)lineBreakMode {

[self setTextAlignment:alignment

lineBreakMode:lineBreakMode

maxLineHeight:14.0f

minLineHeight:14.0f

maxLineSpacing:4.0f

minLineSpacing:4.0f

range:NSMakeRange(0,[self length])];

}

-(void)setTextAlignment:(CTTextAlignment)alignment

lineBreakMode:(CTLineBreakMode)lineBreakMode

maxLineHeight:(CGFloat)maxLineHeight

minLineHeight:(CGFloat)minLineHeight

maxLineSpacing:(CGFloat)maxLineSpacing

minLineSpacing:(CGFloat)minLineSpacing

range:(NSRange)range {

CTParagraphStyleSetting paraStyles6;

paraStyles[0].spec = kCTParagraphStyleSpecifierMaximumLineHeight;

paraStyles[0].valueSize = sizeof(CGFloat);

paraStyles[0].value = &maxLineHeight;

paraStyles1.spec = kCTParagraphStyleSpecifierMinimumLineHeight;

paraStyles1.valueSize = sizeof(CGFloat);

paraStyles1.value = &minLineHeight;

paraStyles2.spec = kCTParagraphStyleSpecifierMaximumLineSpacing;

paraStyles2.valueSize = sizeof(CGFloat);

paraStyles2.value = &maxLineSpacing;

paraStyles3.spec = kCTParagraphStyleSpecifierMinimumLineSpacing;

paraStyles3.valueSize = sizeof(CGFloat);

paraStyles3.value = &minLineSpacing;

paraStyles4.spec = kCTParagraphStyleSpecifierAlignment;

paraStyles4.valueSize = sizeof(CTTextAlignment);

paraStyles4.value = (const void*)&alignment;

paraStyles5.spec = kCTParagraphStyleSpecifierLineBreakMode;

paraStyles5.valueSize = sizeof(CTLineBreakMode);

paraStyles5.value = (const void*)&lineBreakMode;

CTParagraphStyleRef aStyle = CTParagraphStyleCreate(paraStyles, 6);

[self removeAttribute:(NSString*)kCTParagraphStyleAttributeName range:range]; // Work around for Apple leak

[self addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)aStyle range:range];

CFRelease(aStyle);

}

[/c]

これで、以下のように高さが揃うようになる。

サンプルダウンロード:CoreTextLabelSample01


iOS開発:OHAttributedLabelの行間を調整するにつづく