CTFramesetterSuggestFrameSizeWithConstraints результат не может быть использован для вертикально выровненного текста
У меня есть функция, которая - учитывая точку и строку - рисует строку в этой точке. Я хотел бы, чтобы вывод
drawString:"EY" withPoint:CGPointMake(10, 10)
выглядит так же, как (меня особенно интересует выравнивание Y-координат текста):
drawString:"E" withPoint:CGPointMake(10, 10)
drawString:"Y" withPoint:CGPointMake(10+WidthOf("X"), 10)
Я делаю то, что предлагается (среди прочего) здесь ( полный код здесь), я создаю 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-выровнять текстовые выводы?