Objective c 将CTFrame分解为CTLines

Objective c 将CTFrame分解为CTLines,objective-c,core-text,Objective C,Core Text,我有以下代码,它在rect中绘制属性字符串: CGContextRef context = UIGraphicsGetCurrentContext(); CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)string); // left column form CGMutablePathRef leftColumnP

我有以下代码,它在rect中绘制属性字符串:

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);
}
CFArrayRef linesArray=CTFrameGetLines(leftFrame);
对于(CFIndex i=0;i

但是,这与绘制框架的结果不同。我是核心文本的新手,那么我还需要做些什么来划清界限呢?当前此循环执行多次,但仅在屏幕底部绘制一行(使用CTFrameDraw在顶部绘制)

插入
CGContextSetTextPosition(context,x,y)
就在
CTLineDraw
之前,并根据需要更改x&y(不要忘记
y
是反向的)

示例代码提取自:

if(行)
{
CFIndex numberOfLines=CFArrayGetCount(行);
行数=3;
const cgloat fontLineHeight=font.lineHeight;
CGFloat textOffset=0;
CGContextRef ctx=UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
cgContextTranslateCm(ctx,rect.origin.x,rect.origin.y+font.ascender);
CGContextSetTextMatrix(ctx,CGAffineTransformMakeScale(1,-1));

对于(CFIndex lineNumber=0;lineNumber)您需要设置文本变换矩阵,并且在绘制直线之前还需要将绘制点移动到每条直线的原点。
 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);
}