定义核心文本段落而不使用换行符?

我有一个微不足道的问题,为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); 

文本属性正在按预期应用。 但是段落alignment问题很less:

  1. 除非在属性范围的开始处有一个换行符,否则段落不是彼此相邻的位置,而是“内联”的。
  2. 当我添加换行符时,段落被正确地放置在另一个之下,但换行符高度被添加到间距'ParagraphSpacing'间隙。
  3. kCTParagraphStyleSpecifierParagraphSpacingBefore还影响段落范围内的换行符。

什么核心文本布局引擎解释为一个段落指标? 是属性string中的每一个换行符?

在核心文本中,换行符( \n )结束一个段落。 我不认为有办法告诉它使用不同的字符。

如果你在一行中放置两条换行符,那么核心文本的行为就好像你有一个空的段落,所以它会有额外的空间。

确保每段后面都只有一个换行符。 如果您的段落之间仍然有太多空间,则需要为kCTParagraphStyleSpecifierParagraphSpacingBeforekCTParagraphStyleSpecifierParagraphSpacing (或两者)使用较小的值。