核心文本显示的文本被无间距绘制
core text displayed text is drawn without spacing
我正在尝试使用 coretext 显示文本。现在它在 delphi 表单上,但我的代码似乎可以很好地获取绘制形状的上下文(它只是从表单中获取 FContext 字段)。
文字是这样的(上下颠倒),应该是'at'
现在是代码,只需将其放入 formpaint
var
cgcontext : CGContextRef;
path : CGMutablePathRef;
framesetter : CTFramesetterRef;
frame : CTFrameRef;
attrString: CFAttributedStringRef;
function GetCGContextFromCanvas(ACanvas: TCanvas): CGContextRef;
var
Context: TRttiContext;
Field: TRttiField;
begin
Field := Context.GetType(ACanvas.ClassType).GetField('FContext');
Assert(Field <> nil);
Result := PPointer(Field.GetValue(ACanvas).GetReferenceToRawData)^;
end;
begin
cgcontext := GetCGContextFromCanvas(Canvas);
path := CGPathCreateMutable(); //1
CGPathAddRect(path, nil, CGRectMake(0,0,600,200));
attrString := CFAttributedStringCreate(kCFAllocatorDefault, CFSTR('at'), nil);
framesetter := CTFramesetterCreateWithAttributedString(attrString); //3
frame := CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 2), path, nil);
CTFrameDraw(frame, cgcontext); //4
end;
关于间距错误的原因有什么建议吗?它不应该使用默认间距吗?
..是因为textmatrix设置在某处,但是因为当你做CGContextSaveGState/CGContextRestoreGState时它没有恢复,所以textmatrix是错误的。所以只需添加一个 CGContextSetTextMatrix(cgcontext, CGAffineTransformIdentity);
我正在尝试使用 coretext 显示文本。现在它在 delphi 表单上,但我的代码似乎可以很好地获取绘制形状的上下文(它只是从表单中获取 FContext 字段)。
文字是这样的(上下颠倒),应该是'at'
现在是代码,只需将其放入 formpaint
var
cgcontext : CGContextRef;
path : CGMutablePathRef;
framesetter : CTFramesetterRef;
frame : CTFrameRef;
attrString: CFAttributedStringRef;
function GetCGContextFromCanvas(ACanvas: TCanvas): CGContextRef;
var
Context: TRttiContext;
Field: TRttiField;
begin
Field := Context.GetType(ACanvas.ClassType).GetField('FContext');
Assert(Field <> nil);
Result := PPointer(Field.GetValue(ACanvas).GetReferenceToRawData)^;
end;
begin
cgcontext := GetCGContextFromCanvas(Canvas);
path := CGPathCreateMutable(); //1
CGPathAddRect(path, nil, CGRectMake(0,0,600,200));
attrString := CFAttributedStringCreate(kCFAllocatorDefault, CFSTR('at'), nil);
framesetter := CTFramesetterCreateWithAttributedString(attrString); //3
frame := CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 2), path, nil);
CTFrameDraw(frame, cgcontext); //4
end;
关于间距错误的原因有什么建议吗?它不应该使用默认间距吗?
..是因为textmatrix设置在某处,但是因为当你做CGContextSaveGState/CGContextRestoreGState时它没有恢复,所以textmatrix是错误的。所以只需添加一个 CGContextSetTextMatrix(cgcontext, CGAffineTransformIdentity);