таблица в шрифте.

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

Ответы на вопрос(3)

Ваш ответ на вопрос