iOS:使用CoreText更好的理由

时间:2013-02-14 10:31:17

标签: ios objective-c whitespace core-text justify

我使用CoreTextkCTJustifiedTextAlignment在图片周围浮动一些文字,以显示正确的文字 - 但是图片越大,文字区域越小,空格越少CoreText加宽空格,但也加宽字母之间的边距。

见这里: badly justified

这有时看起来非常糟糕,所以我搜索了一些替代方案或解决方法,但只是通过在每个空格后添加更多空格以匹配宽度并使用kCTLeftTextAlignment来找到自己做的建议。 这听起来像很多陷阱,所以我想,我会在这里问,也许任何人都知道如何处理这个问题。

1 个答案:

答案 0 :(得分:5)

这里的基本问题是"所以你想要什么?"另一个显而易见的答案是"完全合理,除非......我要编造的一些规则,就好像只有一个单词。"

如果您想要这种控制,那么您需要下拉到CTLine级别并仅在需要时创建对齐的行。假设您已经对CoreText有所了解,那么这段代码应该有意义。只有当它不是段落的最后一行时,它才能证明该行是正确的。

  CFIndex lineCharacterCount = CTTypesetterSuggestLineBreak(self.typesetter, startIndex, boundsWidth);
  CTLineRef line = CTTypesetterCreateLine(self.typesetter, CFRangeMake(startIndex, lineCharacterCount));

  // Fetch the typographic bounds
  CTLineGetTypographicBounds(line, &(*ascent), &(*descent), &(*leading));

  // Full-justify all but last line of paragraphs
  NSString *string = self.attributedString.string;
  NSUInteger endingLocation = startIndex + lineCharacterCount;
  if (endingLocation >= string.length || [string characterAtIndex:endingLocation] != '\n') {
    CTLineRef justifiedLine = CTLineCreateJustifiedLine(line, 1.0, boundsWidth);
    CFRelease(line);
    line = justifiedLine;
  }

因此,我们根据CTLine建议创建了一个普通的CTTypesetter。然后我们应用一些规则(只有一个单词?不是段落的结尾?无论如何。)如果我们通过,那么我们创建一个新的,合理的行。 (我不确定为什么CTTypesetter无法自行创建合理的广告。)

有关此问题的完整示例,请参阅PinchText。它比你需要的要复杂得多,但它展示了如何用大量的评论来做所有的布局。