這裏的基本問題是「那麼你想要什麼?」另一個明顯的答案是「完全正當的,除非......我要彌補的一些規則就像只有一個詞一樣。」
如果你想要這種控制,那麼你需要下降到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;
}
所以我們創建一個基於CTTypesetter
建議正常CTLine
。那麼我們應用一些規則(只有一個單詞?不是段落的末尾?無論如何)。如果我們通過,那麼我們創建一個新的,對齊的線。 (我不確定爲什麼CTTypesetter
本身不能創建對齊線。)
有關完整示例,請參閱PinchText。它比你需要的要複雜得多,但是它展示瞭如何做大量評論的所有佈局。
嘗試使用softhyphens,這不會完全消除問題,但會減少它會發生的時間。 – 2013-02-14 10:58:29
我沒有看到讓這個更好的方法。下一個單詞太長,以適應與「seiner」單詞在同一行,所以這就是發生了什麼.... – Lefteris 2013-02-14 11:04:12