核心文本显示的文本没有间距绘制

时间:2015-02-16 04:51:10

标签: macos delphi firemonkey core-text

我正在尝试使用coretext显示文本。现在它是在delphi表单上,但我有代码似乎可以正常工作获取绘制形状的上下文(它只是从表单中获取FContext字段)。

文字看起来像这样(它是颠倒的),它假设是'at'

The text appears like this

现在这里是代码,只需将其放入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;

有关间距错误的原因有何建议?它不应该使用默认间距吗?

1 个答案:

答案 0 :(得分:0)

..这是因为textmatrix被设置在某处,但是因为当你执行CGContextSaveGState / CGContextRestoreGState时它没有被恢复,所以textmatrix是错误的。所以只需添加CGContextSetTextMatrix(cgcontext, CGAffineTransformIdentity);

即可