2014-04-09 3 views
2

원하는 앱의 초기 단계로서 단락을 들여 쓰는 간단한 테스트 예제를 UITextView에 설정했습니다. 기본적으로 텍스트로 NSTextStorage을 설정하고 텍스트보기로 전환합니다. 사용자가 들여 쓰기 단추를 누르면 현재 선택 영역과 겹치는 단락을 들여 쓰기로합니다.단락 스타일을 변경 한 후 UITextView 선택을 다시 그려야합니다.

이 아닌 부분은입니다. 단락을 들여 쓰고 나면 파란색 선택 강조 표시가 해당 위치에 그대로 있으며 선택한 텍스트가있는 위치로 이동하지 않습니다. 이 새로 고침을하기 위해 무엇을 놓치고 있습니까?

enter image description here

들여 쓰기의 코드 :

an image showing the selected text in the text view

그리고 여기이 같은 선택은 들여 쓰기 이후의 모습입니다 :

다음은 들여 쓰기 전에 작업 부분의 모습입니다 :

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. 내 코드는 Swift로 작성되었지만 객관적인 C로 변환하는 것이 아무 문제가 아닌가요?

+0

이 코드는 그 자체로는 작동하지 않지만 마지막 줄 앞에'textView.selectedRange = NSMakeRange (0, 0)'(Objective-C에서)를 추가하면 작동합니다. 나는 텍스트보기가 선택된 범위를 가질 필요가 있었고 새로 고침하기 위해 어떻게 든 바뀌 었다고 생각한다. 이 솔루션을 제공해 주셔서 감사합니다. 코드 스 니펫에 해당 행을 추가하기 만하면 답변을 수락합니다. – architectpianist

+0

내가 도와 드릴 수있어서 기쁩니다. 코드 조각을 스 니펫에 추가했습니다.) – matzino

관련 문제