Как межстрочный интервал работает в Core Text? (и чем он отличается от NSLayoutManager?)

Я пытаюсь нарисовать текст, используя функции Core Text, с межстрочным интервалом, максимально приближенным к тому, который был бы, если бы я использовал NSTextView. Например, для Helvetica NSLayoutManager дает 115.0, тогда как CTFont ascent + descent + lead = 96.0. Ясно, что для Helvetica я не смогу использовать ascent + descent + lead для вычисления интервала между строками.

Поэтому я решил использовать 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, но мне интересно, есть ли лучший способ сделать это.

26
задан Steven Vandeweghe 1 April 2011 в 11:17
поделиться