1

我的应用程序包括一个文本格式化工具,它提供粗体、斜体和颜色等按钮,并通过生成 NSAttributedString 并将其设置为 UITextView 的属性文本属性来显示格式化文本。用户选择文本并点击一个按钮后,我得到 UITextView 的 selectedRange 属性,然后获取 UITextView 当前的属性值属性,根据选定的范围为文本添加另一个属性,然后将其分配回属性值文本属性UITextView 再次。

从 iOS 7 开始,我的文本格式开始显示在文本中的错误位置,通常向前移动几个字符。经过一些测试后,我注意到这仅发生在空行之后(例如,一段文本后面有两个换行符),并且格式会为每个空行偏移一个字符。

经过更多测试,我发现当我第一次设置属性文本属性时,任何两个换行符的序列都更改为换行符,然后是“行分隔符”字符(Unicode 8232),然后是第二个换行符。新字符肯定是由属性文本分配添加的,正如我从在该操作之前和之后立即输出每个字符的整数值中看到的那样。但是,UITextView 的 selectedRange 属性忽略了行分隔符,因此它返回的任何范围现在都不正确。

我已经找到了一种解决方法,稍后我将添加它作为答案。我主要发布这个以防其他人遇到问题。此外,我已将此作为错误 15349335 报告给 Apple。

4

1 回答 1

0

I wrote this method to adjust ranges returned by the selectedRange property to account for these extra line separator characters:

- (NSRange)adjustRangeForEmptyLines:(NSRange)range inText:(NSAttributedString *)text byChars:(int)chars {
    int emptyLinesBeforeRange = 0;
    int emptyLinesWithinRange = 0;
    for (int i=0; i<(range.location + range.length); i++) {
        int thisCharacter = [text.string characterAtIndex:i];
        //NSLog(@"thisCharacter: %i", thisCharacter);
        if (thisCharacter == 8232) {
            if (i < range.location) {
                emptyLinesBeforeRange++;
            } else {
                emptyLinesWithinRange++;
            }
        }
    }
    //NSLog(@"found %i + %i empty lines", emptyLinesBeforeRange, emptyLinesWithinRange);
    range.location += (emptyLinesBeforeRange * chars);
    range.length += (emptyLinesWithinRange * chars);
    return range;
}

I can set the byChars argument to 1 or -1 depending on which way I want to adjust. This has been working for me for a few weeks now, but if anyone has an alternate solution, I'd be curious to see it.

于 2013-10-31T17:12:45.683 回答