CTFramesetterSuggestFrameSizeWithConstraints结果对于垂直对齐的文本不可用

时间:2018-10-10 13:24:32

标签: macos cocoa fonts core-graphics core-text

我有一个函数,给定一个点和一个字符串,在此点绘制字符串。我想要

的输出
drawString:"EY" withPoint:CGPointMake(10, 10)

与以下内容相同(我对对齐文本的Y坐标特别感兴趣):

drawString:"E" withPoint:CGPointMake(10, 10)
drawString:"Y" withPoint:CGPointMake(10+WidthOf("X"), 10)

基本上我做了建议的操作(其中包括herefull code here),我创建了具有特定字体的CGAttributedString

void* keys[] = {(void*)kCTFontAttributeName};
void* vals[] = {(void*)(__bridge CTFontRef)[NSFont messageFontOfSize:0]};
CTFramesetterRef cfFramesetterRef = CTFramesetterCreateWithAttributedString(
    CFAttributedStringCreate(
        kCFAllocatorDefault,
        (__bridge CFStringRef)nsstring,
        CFDictionaryCreate(
            kCFAllocatorDefault,
            (void const**)keys,
            (void const**)vals,
            1,
            &kCFCopyStringDictionaryKeyCallBacks,
            &kCFTypeDictionaryValueCallBacks
        )
    )
);

然后,我使用CTFramesetterSuggestFrameSizeWithConstraints并使用具有返回大小的框架绘制字符串:

CFRange cfrangeFit;
CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(cfFramesetterRef, CFRangeMake(0, [nsstring length]), nil, CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX), &cfrangeFit);
CTFrameRef cfFrameRef = CTFramesetterCreateFrame(
    cfFramesetterRef,
    CFRangeMake(0, [nsstring length]),
    CGPathCreateWithRect(CGRectMake(nspoint.x, nspoint.y, size.width, size.height), nil),
    nil
);
(CTFrameDraw(cfFrameRef, [[NSGraphicsContext currentContext] CGContext]));

但是,当我打电话

[self drawString:@"E\u2259" withPoint:CGPointMake(10, 10)];
[self drawString:@"E" withPoint:CGPointMake(30, 10)];
[self drawString:@"\u2259" withPoint:CGPointMake(40, 10)];

我希望两个E和两个的Y坐标对齐。但是,第二个E的Y坐标比第一个小。 (请参阅https://ibb.co/gQQFG9以供参考。)

原因是CTFramesetterSuggestFrameSizeWithConstraints返回以下高度(可能是因为MacOS进行了字体替换,可能是从“ Apple Symbols”中选择了):

E≙ -> 17
E   -> 16
≙   -> 13

但是,如果我的文字应该Y对齐,那么采用为矩形指定的高度是不明智的。相反,我希望我必须以某种方式合并字体的基线。

  • CTFramesetterSuggestFrameSizeWithConstraints的结果如何与字体的基线相关?
  • 如何可靠地使文本输出Y对齐?

0 个答案:

没有答案