核心文本显示的文本被无间距绘制

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);