NSLineBreakByWordWrapping打破了哪些字符?

时间:2013-02-27 17:39:17

标签: ios objective-c uilabel

简短版

来自文档:

  

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中看到的其他一些字符。是否有完整的字符列表我应该打破?

1 个答案:

答案 0 :(得分:0)

我建议使用“非字母数字”作为测试。

[[NSCharacterSet alphanumerCharacterSet] invertedSet]

也就是说,如果你做了很多这样的事情,你可能会考虑使用CTFramesetter来代替UILabel进行布局。然后,您可以使用CTRunGetImageBounds来计算实际的数量。你不必计算你的单词中断,因为CTFrame已经为你完成了这个(并且它将保证是相同的算法)。