2013-02-14 40 views
2

我使用CoreTextkCTJustifiedTextAlignment顯示文本justiefied浮動圖像周圍的一些文字 - 但較大的圖像,較小的文本區域,少空格CoreText不僅加寬空格也保證金字母之間。iOS版:更好的理由與CoreText

在這裏看到: badly justified

這有時看起來非常可怕,所以我搜索了一些替代品或解決方法,但只找到了建議每個空格後增加更多的空格相匹配的寬度和使用kCTLeftTextAlignment做我自己。 聽起來好像有很多陷阱需要處理,所以我想,我會在這裏問,也許任何人有一個想法如何處理這個問題。

+0

嘗試使用softhyphens,這不會完全消除問題,但會減少它會發生的時間。 – 2013-02-14 10:58:29

+3

我沒有看到讓這個更好的方法。下一個單詞太長,以適應與「seiner」單詞在同一行,所以這就是發生了什麼.... – Lefteris 2013-02-14 11:04:12

回答

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; 
    } 

所以我們創建一個基於CTTypesetter建議正常CTLine。那麼我們應用一些規則(只有一個單詞?不是段落的末尾?無論如何)。如果我們通過,那麼我們創建一個新的,對齊的線。 (我不確定爲什麼CTTypesetter本身不能創建對齊線。)

有關完整示例,請參閱PinchText。它比你需要的要複雜得多,但是它展示瞭如何做大量評論的所有佈局。

+2

偉大的一段代碼,謝謝! – 2013-02-20 21:52:08

+0

@RobNapier,你太棒了。那裏真的很棒。 – 2015-03-14 23:22:10

+0

@RobNapier,真的很感謝你在那裏的工作。但不知何故筆畫或填充顏色停止工作的iOS 10,我已經發布了一個問題在這裏:[CoreGraphics忽略CGContextSetFillColorWithColor並繪製黑色](http://stackoverflow.com/q/42274667/593709)你可以給一些提示那裏? – 2017-02-16 13:00:30