ユーザーが現在の行の先頭にタブを挿入できるように、UITextViewにタブ挿入ボタンが必要です。カーソルが行のどこにあっても、タブは行の先頭に挿入する必要があり、その後、カーソルは行の末尾に移動する必要があります。
出来ますか ?
ユーザーが現在の行の先頭にタブを挿入できるように、UITextViewにタブ挿入ボタンが必要です。カーソルが行のどこにあっても、タブは行の先頭に挿入する必要があり、その後、カーソルは行の末尾に移動する必要があります。
出来ますか ?
positionFromPosition:inDirection:offset:
とは運が悪いcharacterRangeByExtendingPosition:inDirection:
。
しかし、これは私にとってはうまくいきます:
UITextRange *range = [textView selectedTextRange];
CGRect rect = [textView caretRectForPosition:range.start];
UITextPosition *start = [textView closestPositionToPoint:CGPointMake(0, rect.origin.y)];
[textView setSelectedTextRange:[textView textRangeFromPosition:start toPosition:start]];
UPD:上記のコードはiOS7以前でテストされています。また、iOS9では動作しなくなりました。実際、iOS9デバイスで実行されているテキスト編集アプリにいくつかのバグがあります。アプリを修正した後、回答を更新します。
UITextViewは、UITextInputプロトコルを実装します。このプロトコルには、テキストの位置を決定するための一連のメソッドがあります。これについてはよくわかりませんが、おそらく次のように呼び出すことができます。
selectedTextRange
カレットの位置を取得します。positionFromPosition:inDirection:offset:
現在の行の先頭までの範囲をUITextLayoutDirectionLeft
見つけるために。(これについてはよくわかりません。おそらくcharacterRangeByExtendingPosition:inDirection:
もっとうまくいくでしょうか?)textRangeFromPosition:toPosition:
linの開始の範囲を取得するために使用します。replaceRange:withText:
タブを挿入するために使用します。そのプロトコルには、それが機能しないかどうかを判断できる他の方法があるかもしれません。
編集:UITextViewはiOS 5の時点でUITextInputのみを実装しているようです。それ以前にターゲットを設定している場合は、何を提案すればよいかわかりません。
カーソルを行の先頭に移動するために使用していたコード()を追加します。これは、カーソルが前の行の先頭ではなく前homeTap
の行の先頭に移動されることに関して、@zxcatの回答内のコメントの一部に対応しているためです。現在の行:
- (void)homeTap:(id)s {
UITextRange* range = [_textView selectedTextRange];
CGRect rect = [_textView caretRectForPosition:range.start];
float halfLineHeight = _textView.font.lineHeight / 2.0;
UITextPosition* start = [_textView closestPositionToPoint:CGPointMake(0, rect.origin.y + halfLineHeight)];
[_textView setSelectedTextRange:[_textView textRangeFromPosition:start toPosition:start]];
}
具体的には、からの結果が現在の行のものであることを確認するためにに追加halfLineHeight
します。rect.origin.y
closestPositionToPoint