Определить абзацы основного текста без использования символа новой строки? - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть тривиальная проблема с применением правильного верхнего и нижнего промежутка для абзацев в NSAttributedString.Я использую этот код для установки атрибутов абзаца:

int sf = sizeof(CGFloat);
        CTParagraphStyleSetting settings[ParagraphStylesSupported] = 
            {
                { kCTParagraphStyleSpecifierAlignment, sizeof(QuartzTextAlignment), &style.textAlignment },
                { kCTParagraphStyleSpecifierParagraphSpacingBefore, sf, &marginTop},
                { kCTParagraphStyleSpecifierParagraphSpacing, sf, &marginBot},
                { kCTParagraphStyleSpecifierMinimumLineHeight, sf, &lineHeight},

                { kCTParagraphStyleSpecifierLineSpacing, sf, &lineSpacing},
                { kCTParagraphStyleSpecifierFirstLineHeadIndent, sf, &style.firstLineIndent},

            };

            CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, ParagraphStylesSupported);


            [string addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)paragraphStyle range:item.range];
            CFRelease(paragraphStyle);

Свойства текста применяются, как и ожидалось.Но есть немного проблем с выравниванием абзаца:

  1. Абзацы размещаются не после друг друга, а в виде строки, если в начале диапазона атрибутов нет символа новой строки \ n.
  2. Когда я добавляю символ новой строки, тогда абзацы правильно размещаются один под другим, но высота пробела добавляется к пробелам 'ParagraphSpacing'.
  3. kCTParagraphStyleSpecifierParagraphSpacingBefore влияет также на символ новой строки внутри абзацаrange.

Какой механизм разметки Core Text интерпретирует как индикатор абзаца?Это все символы новой строки в указанной строке?

1 Ответ

2 голосов
/ 21 февраля 2012

В Базовом тексте символ новой строки (\n) оканчивает абзац. Я не думаю, что есть способ заставить его использовать другой символ.

Если вы поместите две строки в строку, то основной текст будет действовать так, как если бы у вас был пустой абзац, поэтому будет добавлен дополнительный интервал.

Убедитесь, что у вас есть только одна новая строка после каждого абзаца. Если ваши абзацы все еще имеют слишком много места между ними, вам нужно использовать меньшее значение для kCTParagraphStyleSpecifierParagraphSpacingBefore или kCTParagraphStyleSpecifierParagraphSpacing (или обоих).

...