Пространство между двумя последними строками абзаца больше? - PullRequest
2 голосов
/ 25 марта 2012

Я рисую текст с помощью CTFramesetter, я установил kCTParagraphStyleSpecifierParagraphSpacing, kCTParagraphStyleSpecifierLineSpacing, kCTParagraphStyleSpecifierParagraphSpacingBefore все в 0.0.

Как вы можете видеть на изображении, пространство между двумя последними строками абзаца намного больше, чем у других.

На этом изображении всего 15 строк, я вставил их восхождение , спуск , ведущий , origin.y далее мы можем видеть, что подъем и спуск на 5-й и 10-й строке больше, чем у других, я не смог найти какой-либо спецификатор для установки, чтобы избежать этого странного расположения.

Есть идеи?

1  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 399.000000
2  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 374.000000
3  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 349.000000
4  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 324.000000
5  ascent=25.722656, desecent=13.699219, leading=0.720000, origin.y: 294.000000
6  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 258.000000
7  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 233.000000
8  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 208.000000
9  ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 183.000000
10 ascent=25.722656, descent=13.699219, leading=0.720000, origin.y: 153.000000
11 ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 117.000000
12 ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 92.000000
13 ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 67.000000
14 ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 42.000000
15 ascent=20.639999, descent=3.360000, leading=0.720000, origin.y: 17.000000 

enter image description here

Ответы [ 2 ]

1 голос
/ 31 июля 2012

Если вы используете NSMutableAttributeString для размещения текста, вы можете установить атрибут CTRunDelegate, чтобы установить для метрики \ n значение 0. Для меня это сработало:

        CTRunDelegateCallbacks callbacks;
        callbacks.version = kCTRunDelegateVersion1;
        callbacks.getAscent = lineBreakCallback;
        callbacks.getDescent = lineBreakCallback;
        callbacks.getWidth = lineBreakCallback;

        CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"System", 1.0f, NULL);

        CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, NULL); //3
        NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys:
                                                //set the delegate
                                                (__bridge id)delegate, (NSString*)kCTRunDelegateAttributeName,
                                                (__bridge id)fontRef, kCTFontAttributeName,
                                                nil];
        stringLength++;
        [attString appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n" attributes:attrDictionaryDelegate]];

        CFRelease(delegate);
        CFRelease(fontRef);

и

static CGFloat lineBreakCallback( void* ref )
{
    return 0;
}

РЕДАКТИРОВАТЬ:

  • следующие комментарии Я исправил часть управления памятью (надеюсь, что правильно)
  • Я добавил атрибут шрифта с размером шрифта 1. Это потому, что когдаразмер шрифта прогона (по умолчанию размер шрифта составляет около 16) больше, чем остальная часть строки, он изменяет метрику строки, даже если метрики прогона меньше (что довольно раздражает, если вы действительно хотите установить больший размер шрифта длячасть линии без изменения, например, спуска линии - я еще не нашел решения этой проблемы).
0 голосов
/ 26 марта 2012

Дамит, это ошибка.DTCoreText решает эту проблему путем изменения исходного положения этих затронутых линий.

см. http://www.cocoanetics.com/2012/02/radar-coretext-line-spacing-bug/

...