iOS開発:OHAttributedLabelの行間を調整する
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