Я пытаюсь нарисовать текст, используя функции Core Text, с межстрочным интервалом, максимально приближенным к тому, который был бы, если бы я использовал NSTextView.
Возьмите этот шрифт в качестве примера:
NSFont *font = [NSFont fontWithName:@"Times New Roman" size:96.0];
Высота строки этого шрифта, если бы я использовал его в NSTextView, составляла 111.0.
NSLayoutManager *lm = [[NSLayoutManager alloc] init];
NSLog(@"%f", [lm defaultLineHeightForFont:font]); // this is 111.0
Теперь, если я сделаю то же самое с Core Text, результат будет 110.4 (при условии, что вы можете вычислить высоту линии, добавив подъем, спуск и ведение).
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSLog(@"%f", CTFontGetDescent(cFont) + CTFontGetAscent(cFont) +
CTFontGetLeading(cFont)); // this is 110.390625
Это очень близко к 111.0, но для некоторых шрифтов разница намного больше.Например, для Helvetica NSLayoutManager дает 115.0, тогда как CTFont ascent + descent + lead = 96.0.Ясно, что для Helvetica я не смог бы использовать подъем + спуск + ведущий для вычисления расстояния между линиями.
Поэтому я подумал, что я бы использовал CTFrame и CTFramesetter, чтобы расположить несколько строк и получить расстояние между строкамиОт этого.Но это также дает разные значения.
CTFontRef cFont = CTFontCreateWithName(CFSTR("Times New Roman"), 96.0, NULL);
NSDictionary *attrs = [NSDictionary dictionaryWithObject:(id)cFont forKey:(id)kCTFontAttributeName];
NSAttributedString *threeLines = [[NSAttributedString alloc] initWithString:@"abcdefg\nabcdefg\nabcdefg" attributes:attrs];
CTFramesetterRef threeLineFramesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)threeLines);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0.0, 0.0, 600.0, 600.0));
CTFrameRef threeLineFrame = CTFramesetterCreateFrame(threeLineFramesetter, CFRangeMake(0, 0), path, NULL);
CGPoint lineOrigins[3];
CTFrameGetLineOrigins(threeLineFrame, CFRangeMake(0, 0), lineOrigins);
NSLog(@"space between line 1 and 2: %f", lineOrigins[0].y - lineOrigins[1].y); // result: 119.278125
NSLog(@"space between line 2 and 3: %f", lineOrigins[1].y - lineOrigins[2].y); // result: 113.625000
Таким образом, межстрочный интервал теперь еще больше отличается от 111.0, который использовался в моем NSTextView, и не каждая строка равна.Кажется, что разрывы строк добавляют дополнительный пробел (хотя значение по умолчанию для paragraphSpacingBefore
равно 0,0).
Сейчас я работаю над этой проблемой, получая высоту строки через NSLayoutManager, а затем по отдельности рисуя каждыйCTLine, но мне интересно, есть ли лучший способ сделать это.