CTFramesetterSuggestFrameSizeWithConstraints результат не может быть использован для вертикально выровненного текста - PullRequest
0 голосов
/ 10 октября 2018

У меня есть функция, которая - учитывая точку и строку - рисует строку в этой точке.Мне бы хотелось, чтобы вывод

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 s и два быть выровненным по их Y-координатам.Однако вторая E имеет меньшую Y-координату, чем первая.(См. https://ibb.co/gQQFG9 для справки.)

Причина в том, что CTFramesetterSuggestFrameSizeWithConstraints возвращает следующие значения высоты (возможно, из-за того, что MacOS выполняет замену шрифта, предположительно выбирая из «Apple Symbols»):

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

Однако брать эти высоты, заданные для прямоугольника, нецелесообразно, если мои тексты должны быть выровнены по Y.Вместо этого я ожидал бы, что мне придется каким-то образом включить базовую линию шрифта.

  • (Как) относится результат CTFramesetterSuggestFrameSizeWithConstraints к базовой линии шрифта?
  • Как я могунадежно Y-выровнять вывод текста?
...