作りたいアプリの準備段階として、段落をインデントする簡単なテスト例を設定しましたUITextView
。基本的に、いくつかのテキストで をセットアップしNSTextStorage
、テキスト ビューに配置します。ユーザーがインデント ボタンをタップすると、現在の選択範囲に重なる段落をインデントする必要があります。
機能しない部分は、段落がインデントされた後、青い選択ハイライトがその場所にとどまり、選択されたテキストが現在配置されている場所に移動しないことです. この更新を行うために何が欠けていますか?
インデントの前の作業部分は次のようになります。
インデント後の同じ選択範囲は次のようになります。
インデントのコード:
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];
ばかげた質問かもしれませんが、よろしければご覧いただければ幸いです。ご協力いただきありがとうございます!