3

長方形に属性付きの文字列を描画する次のコードがあります。

CGContextRef context = UIGraphicsGetCurrentContext();
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)string);

    // left column form
    CGMutablePathRef leftColumnPath = CGPathCreateMutable();
    CGPathAddRect(leftColumnPath, NULL, CGRectMake(rect.origin.x, -rect.origin.y,rect.size.width, self.bounds.size.height));

    // left column frame
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);   
    CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), leftColumnPath, NULL);
    CTFrameDraw(leftFrame, context);

ここではすべて正常に機能しますが、個々の行をより細かく制御する必要があります。そのため、フレームを描くのではなく、各線を別々に描きたいと思います。だから私はこれを使ってCTFrameDrawを使う代わりに試しています:

CFArrayRef linesArray =  CTFrameGetLines(leftFrame);
    for (CFIndex i = 0; i < CFArrayGetCount(linesArray); i++){
        CTLineRef line = CFArrayGetValueAtIndex(linesArray, i);
        CTLineDraw(line, context);
}

ただし、これはフレームを描画するのと同じ結果を描画しません。私はCoreTextの初心者ですが、線を引くためにもっとや​​るべきことはありますか?現在、このループは数回実行されますが、画面の下部に描画される線は1つだけです(CTFrameDrawでは上部に描画されません)。

4

2 に答える 2

2

CGContextSetTextPosition(context, x, y)直前に挿入し、必要に応じてxとyを変更します(逆になっているCTLineDrawことを忘れないでください)y

于 2012-05-14T02:14:26.163 に答える
1

https://github.com/BigZaphod/Chameleon/blob/master/UIKit/Classes/UIStringDrawing.mから抽出されたサンプルコード

 if (lines)
 {
     CFIndex numberOfLines = CFArrayGetCount(lines);

    numberOfLines = 3;

    const CGFloat fontLineHeight = font.lineHeight;
    CGFloat textOffset = 0;

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);
    CGContextTranslateCTM(ctx, rect.origin.x, rect.origin.y+font.ascender);
    CGContextSetTextMatrix(ctx, CGAffineTransformMakeScale(1,-1));

    for (CFIndex lineNumber=0; lineNumber<numberOfLines; lineNumber++) {
        CTLineRef line = CFArrayGetValueAtIndex(lines, lineNumber);
        float flush = 0.5;

        switch (alignment) {
            case UITextAlignmentCenter: flush = 0.5;    break;
            case UITextAlignmentRight:  flush = 1;      break;
            case UITextAlignmentLeft:
            default:                    flush = 0;      break;
        }

        CGFloat penOffset = CTLineGetPenOffsetForFlush(line, flush, rect.size.width);
        CGContextSetTextPosition(ctx, penOffset, textOffset);
        CTLineDraw(line, ctx);
        textOffset += fontLineHeight;
    }

    CGContextRestoreGState(ctx);

    CFRelease(lines);
}
于 2012-07-09T09:26:04.337 に答える