2012-02-18 81 views
0

我在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还影响段落范围内的换行符。

什么核心文本布局引擎解释为段落指示符? 属性字符串中是否每个换行符都是?

回答

2

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

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

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

+0

似乎是真的。我的另外一个问题是:为什么kCTParagraphStyleSpecifierParagraphSpacingBefore从不为NSAttributedString的第一段工作? – Lukasz 2012-02-24 09:09:51

+0

我不知道。 – 2012-02-24 09:13:18