UITextView内のカーソル位置をCGRectで取得する

iOSでTextViewというと,UITextViewを使うのが一般的だ.
いろいろとイベントが用意されていて楽なのだが,カーソル位置を取得するのに結構迷ったので書き残しておく.

目的は,UITextViewのインスタンスが与えられたところから,カーソル位置をCGRectで取得することだ.



まずは,UITextView内のカーソル位置を,相対的にでもいいので取得する.

カーソル,キャレット,というより選択範囲が取得できる.

let textRange: UITextRange = textView.selectedTextRange

何も選択していなければカーソルの位置が帰ってくる.
ただし,型はUITextRangeだ.

次にこいつをCGRectに変換する.

let position: CGRect = textView.caretRectForPosition(textRange.start)

textRangeはその名の通り,範囲を示している.
それを,UITextPositionの値にしてやる.
今回は,範囲選択されてない前提だったので,startにした(範囲選択されてないのだからendでもいい).

で,そしてcaretRectForPositionしてやると,見事CGRectになる.




UITextRangeやUITextPositionまでは調べると簡単にわかったのだけれど,CGRectにするのはなかなか見つからなかった.

参考

the moon at dawn: UITextFieldのキャレットを操作(UITextRangeとUITextPosition)


stackoverflow.com

stackoverflow.com