5

カスタムの行間でテキストを作成したいので、属性文字列を書き、CTParagraphStyleAttributteそれを my に渡しますCATextLayer

UIFont *font = [UIFont systemFontOfSize:20];
CTFontRef ctFont = CTFontCreateWithName((CFStringRef)font.fontName,
                                        font.pointSize, NULL);
CGColorRef cgColor = [UIColor whiteColor].CGColor;
CGFloat leading = 25.0;
CTTextAlignment alignment = kCTRightTextAlignment; // just for test purposes
const CTParagraphStyleSetting styleSettings[] = {
    {kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof(CGFloat), &leading},
    {kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment}
};
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(styleSettings, 2));
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            (id)ctFont, (id)kCTFontAttributeName,
                            (id)cgColor, (id)kCTForegroundColorAttributeName,
                            (id)paragraphStyle, (id)kCTParagraphStyleAttributeName,
                            nil];
CFRelease(ctFont);
CFRelease(paragraphStyle);

NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] 
                                                 initWithString:string
                                                     attributes:attributes];
_textLayer.string = attrStr;
[attrStr release];

しかし、行の高さは変わりません。ここで何かが欠けていると思いますが、何がわかりません。

kCTParagraphStyleSpecifierLineSpacingAdjustmentandを試してみましkCTParagraphStyleSpecifierLineSpacingたが、どちらも機能しないようです(?)。テストするためだけにkCTParagraphStyleSpecifierAlignment(そのためのプロパティがあることはわかっています)を使用してアライメントを設定しようとしましたが、実際には機能しませんでした。CATextLayerkCTParagraphStyleAttributeName

CTParagraphStyleCreate(styleSettings, -555);クレイジーな値 (例: ) を渡しても、次のように自問することに気付きました:CATextLayer段落属性をサポートしていますか? もしそうなら、私はここで何が欠けていますか?

4

1 に答える 1

3

NSAttributedString を CATextLayer に入れてコードを試してみましたが、あなたが言ったようにフォーマットを無視しました。

次に、まったく同じ属性文字列を をdrawRect使用して UIView メソッドに描画しようCTFrameDrawとしましたが、すべてのフォーマットに従いました。CATextLayer がそのフォーマットの大部分を無視しているとしか思えません。CATextLayerクラス リファレンスには、効率化のために何を行うかについて多くの警告があります。

CALayerではなくに描画する必要がある場合はUIView、独自の CALayer サブクラスまたはデリゲートを作成し、そこで描画を行うことができます。

- (void)drawRect:(CGRect)rect
{
    //
    // Build attrStr as before.
    //

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect bounds = [self bounds];

    // Text ends up drawn inverted, so we have to reverse it.
    CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);
    CGContextTranslateCTM( ctx, bounds.origin.x, bounds.origin.y+bounds.size.height );
    CGContextScaleCTM( ctx, 1, -1 );

    // Build a rectangle for drawing in.
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, bounds);

    // Create the frame and draw it into the graphics context
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) attrStr);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
    CFRelease(framesetter);
    CFRelease(path);

    // Finally do the drawing.
    CTFrameDraw(frame, ctx);
    CFRelease(frame);          
}
于 2012-04-09T12:55:00.817 に答える