这里的基本问题是“那你想要什么?” 另一个明显的答案是“完全证明,除非……我要制定一些规则,比如只有一个词。”
如果您想要这种控制,那么您需要下拉到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。它比您需要的要复杂得多,但它展示了如何使用大量注释进行所有布局。