Objective c 将CTFrame分解为CTLines
我有以下代码,它在rect中绘制属性字符串: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
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);
}