简短版
来自文档:
NSLineBreakByWordWrapping
在词边界处发生包装,除非单词本身不适合单行。
所有字边界字符的集合是什么?
更长版本
我有一组UILabel,其中包含文本,有时包括URL。我需要知道网址的确切位置(frame
,而不是range
),以便我可以将它们设置为可点击。我的数学大部分都有效,但我必须为某些角色进行测试:
// This code only reached if the URL is longer than the available width
NSString *theText = // A string containing an HTTP/HTTPS URL
NSCharacterSet *breakChars = [NSCharacterSet characterSetWithCharactersInString:@"?-"];
NSString *charsInRemaininsSpace = // NSString with remaining text on this line
NSUInteger breakIndex = NSNotFound;
if (charsInRemaininsSpace)
breakIndex = [charsInRemaininsSpace rangeOfCharacterFromSet:breakChars
options:NSBackwardsSearch].location;
if (breakIndex != NSNotFound && breakIndex != theText.length-1) {
// There is a breakable char in the middle, so draw a URL through that, then break
// ...
} else {
// There is no breakable char (or it's at the end), so start this word on a new line
// ...
}
我的NSCharacterSet中的字符只是? - - 我发现NSLineBreakByWordWrapping中断了。它不会破坏我在%和=等URL中看到的其他一些字符。是否有完整的字符列表我应该打破?
答案 0 :(得分:0)
我建议使用“非字母数字”作为测试。
[[NSCharacterSet alphanumerCharacterSet] invertedSet]
也就是说,如果你做了很多这样的事情,你可能会考虑使用CTFramesetter
来代替UILabel
进行布局。然后,您可以使用CTRunGetImageBounds
来计算实际的数量。你不必计算你的单词中断,因为CTFrame
已经为你完成了这个(并且它将保证是相同的算法)。