更改段落样式后重绘UITextView选择

时间:2014-04-09 02:11:08

标签: ios uitextview textkit

作为我想要制作的应用程序的初步阶段,我已经设置了一个简单的测试示例,用于缩进UITextView中的段落。它基本上设置了一个带有一些文本的NSTextStorage并将其放在文本视图中。当用户点击缩进按钮时,我希望与当前选择重叠的段落缩进。

工作的部分是在缩进段落后,蓝色选择突出显示停留在该位置,并且不会移动到所选文本现在所在的位置。为了让这次更新发生,我错过了什么?

以下是缩进前的工作部分:

an image showing the selected text in the text view

以下是缩进后的相同选择:

enter image description here

缩进的代码:

UITextRange *startRange = [textView.tokenizer rangeEnclosingPosition:[textView selectedTextRange].start withGranularity:UITextGranularityParagraph inDirection:UITextStorageDirectionForward];
UITextRange *endRange = [textView.tokenizer rangeEnclosingPosition:[textView selectedTextRange].end withGranularity:UITextGranularityParagraph inDirection:UITextStorageDirectionBackward];
NSInteger startOffset = MIN([textView offsetFromPosition:textView.beginningOfDocument toPosition:startRange.start], [textView offsetFromPosition:textView.beginningOfDocument toPosition:endRange.start]);
NSInteger endOffset = MAX([textView offsetFromPosition:textView.beginningOfDocument toPosition:endRange.end], [textView offsetFromPosition:textView.beginningOfDocument toPosition:startRange.end]);
NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);

[self.textStorage beginEditing];
[self.textStorage enumerateAttribute:NSParagraphStyleAttributeName
                             inRange:offsetRange
                             options:0
                          usingBlock:^(id value, NSRange range, BOOL *stop) {
                              ((NSMutableParagraphStyle *)value).firstLineHeadIndent += [self tabIndent];
                              ((NSMutableParagraphStyle *)value).headIndent += [self tabIndent];
                              [self.textStorage removeAttribute:NSParagraphStyleAttributeName range:range];
                              [self.textStorage addAttribute:NSParagraphStyleAttributeName value:value range:range];
                          }];
[self.textStorage endEditing];

也许这是一个愚蠢的问题,但我很欣赏外面的眼睛。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

有点晚了,但也许它可以帮助你或其他人......

您可以通过设置selectedTextRange来更改UITextInput-Protocol的选择。

let beginning: UITextPosition = textView.beginningOfDocument
let start: UITextPosition = textView.positionFromPosition(beginning, offset: textView.selectedRange.location)
let end: UITextPosition = textView.positionFromPosition(start!, offset: textView.selectedRange.length)

textView.selectedRange = NSMakeRange(0, 0)
textView.selectedTextRange = textView.textRangeFromPosition(start!, toPosition: end!)

P.S。我的代码是用Swift编写的,但我认为将它转换为目标c或者?

是没有问题的