简体   繁体   English

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

[英]Redrawing UITextView selection after changing paragraph style

As a preliminary stage to an app I want to make, I've set up a simple test example of indenting the paragraphs in a UITextView . 作为我要制作的应用程序的初步阶段,我建立了一个简单的测试示例,以缩进UITextView的段落。 It basically sets up an NSTextStorage with some text and puts it in a text view. 基本上,它NSTextStorage使用一些文本来设置NSTextStorage并将其置于文本视图中。 When the user taps an indent button, I want the paragraph(s) that overlap the current selection to indent. 当用户点击缩进按钮时,我希望与当前选择重叠的段落缩进。

The part that doesn't work is that after the paragraph is indented, the blue selection highlight stays in that location and doesn't move to where the text that was selected is now located. 无效的部分是,将段落缩进后,蓝色选择突出显示将停留在该位置,并且不会移动到现在所选择的文本所在的位置。 What am I missing to make this refresh happen? 我错过了什么来进行这种刷新?

Here's what the working part before the indent looks like: 缩进之前的工作部分如下所示:

在文本视图中显示所选文本的图像

And here's what the same selection looks like after the indent: 这是缩进后相同选择的外观:

在此处输入图片说明

The code for the indention: 缩进的代码:

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];

Maybe this is a silly question, but I'd appreciate an outside eye. 也许这是一个愚蠢的问题,但我希望能有一个外在的眼光。 Thanks for your help! 谢谢你的帮助!

It is a bit late, but maybe it helps you or others.... 有点晚了,但也许对您或其他人有帮助。

You can change the selection through the UITextInput-Protocol by setting the selectedTextRange . 您可以通过设置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!)

PS My code is written in Swift, but I think it is no problem to convert that to objective c, or? PS我的代码是用Swift编写的,但是我认为将其转换为目标c没问题,或者?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM