61

Core Text の行間隔については、完全に理解できません。私は NSAttributedString を使用しており、次の属性を指定しています: - kCTFontAttributeName - kCTParagraphStyleAttributeName

これから CTFrameSetter が作成され、コンテキストに描画されます。

段落スタイル属性で、行の高さを指定したいと思います。

kCTParagraphStyleSpecifierLineHeightMultiple を使用すると、テキストがこの高さの中央に表示されるのではなく、各行がテキストの上部にパディングを受け取ります。

kCTParagraphStyleSpecifierLineSpacing を使用すると、テキストの下部にパディングが追加されます。

テキストが行の一番下または一番上にあるのではなく、その高さの真ん中にあるテキスト(グリフ)で指定された行の高さを達成するのを手伝ってください。

CTLine などを明示的に作成するルートをたどらないと、これは不可能ですか?

4

10 に答える 10

120

Objective-C

NSInteger strLength = [myString length];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attString addAttribute:NSParagraphStyleAttributeName
                  value:style
                  range:NSMakeRange(0, strLength)];

スイフト5

let strLength = myString.length()
var style = NSMutableParagraphStyle()
style.lineSpacing = 24
attString.addAttribute(.paragraphStyle, value: style, range: NSRange(location: 0, length: strLength))
于 2013-05-02T12:21:14.430 に答える
11

以下の記述に 100% の自信があるわけではありませんが、理にかなっているようです。私が間違っているところを修正してください。

行の高さ (行送り) は、タイプの連続する行のベースライン間の距離を指します。ここでのベースラインは、テキストが置かれている架空の線として解釈できます。

間隔は、行間のスペースです。テキスト行の後にスペースが表示されます。

私は自分の問題に対して次の解決策を使用することになりました:

// NOT SURE WHAT THE THEORY BEHIND THIS FACTOR IS. WAS FOUND VIA TRIAL AND ERROR.
    CGFloat factor = 14.5/30.5;
    CGFloat floatValues[4];
    floatValues[0] = self.lineHeight * factor/(factor + 1);
    floatValues[1] = self.lineHeight/(factor + 1);
    floatValues[2] = self.lineHeight;

このマトリックスは、NSAttributedString の段落スタイル パラメーターと共に使用されます。

CTParagraphStyleSetting paragraphStyle[3];

paragraphStyle[0].spec = kCTParagraphStyleSpecifierLineSpacing;
paragraphStyle[0].valueSize = sizeof(CGFloat);
paragraphStyle[0].value = &floatValues[0];

paragraphStyle[1].spec = kCTParagraphStyleSpecifierMinimumLineHeight;
paragraphStyle[1].valueSize = sizeof(CGFloat);
paragraphStyle[1].value = &floatValues[1];

paragraphStyle[2].spec = kCTParagraphStyleSpecifierMaximumLineHeight;
paragraphStyle[2].valueSize = sizeof(CGFloat);
paragraphStyle[2].value = &floatValues[2];

CTParagraphStyleRef style = CTParagraphStyleCreate((const CTParagraphStyleSetting*) &paragraphStyle, 3);
[attributedString addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)style range:NSMakeRange(0, [string length])];
CFRelease(style);

これが誰かに役立つことを願っています。より関連性の高い情報を発見したら、この回答を更新します。

于 2011-11-17T06:15:57.407 に答える
0

これはXcode 7.2でうまくいきました。iOS 9.2.1。(スウィフト 2.1.):

  dispatch_async(dispatch_get_main_queue()) { () -> Void in
        let paragraphStyleWithSpacing           = NSMutableParagraphStyle()
        paragraphStyleWithSpacing.lineSpacing   = 2.0 //CGFloat
        let textWithLineSpacing                 = NSAttributedString(string: str, attributes: [NSParagraphStyleAttributeName : paragraphStyleWithSpacing])
        self.MY_TEXT_VIEW_NAME.attributedText   = textWithLineSpacing
    }
于 2016-02-12T09:13:29.670 に答える