2

精简版

从文档:

NSLineBreakByWordWrapping

换行发生在单词边界,除非单词本身不适合单行。

所有单词边界字符的集合是什么?

更长的版本

我有一组 UILabel,其中包含文本,有时还包括 URL。我需要知道 URL 的确切位置(frame, not 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 中看到的其他字符。是否有我应该打破的角色的完整列表?

4

1 回答 1

0

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

[[NSCharacterSet alphanumerCharacterSet] invertedSet]

也就是说,如果你做了很多这样的事情,你可能想要考虑使用CTFramesetter来做你的布局而不是UILabel. 然后你可以CTRunGetImageBounds用来计算实际的矩形。您不必计算分词,因为CTFrame已经为您完成了此操作(并且可以保证使用相同的算法)。

于 2013-02-27T17:53:46.740 回答