2014-04-09 32 views
2

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

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

下面是缩进前工作部分的样子:

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

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

+0

您是否找到了解决方案? – matzino

回答

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是没有问题的,或者?

+0

这段代码本身并不起作用,但我试过并在最后一行之前添加了'textView.selectedRange = NSMakeRange(0,0)'(在Objective-C中),然后它确实工作了。我认为文本视图需要让选定范围以某种方式更改以便刷新。非常感谢您提供这种解决方案!如果您只是将该行添加到代码段中,我会接受您的答案。 – architectpianist

+0

我很高兴我可以帮助你:)将你的代码行添加到片段;) – matzino