2

我在图像周围浮动一些文本,并使用CoreTextkCTJustifiedTextAlignment显示文本对齐 - 但是对于更大的图像,更小的文本区域和更少的空白CoreText不仅会扩大空白,还会扩大字母之间的边距。

看这里: 非常有道理

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

4

1 回答 1

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。它比您需要的要复杂得多,但它展示了如何使用大量注释进行所有布局。

于 2013-02-19T23:28:58.233 回答