UItextInput是一個(gè)protocol,一般來說,文字處理的控件都要遵守這個(gè)協(xié)議。如UITextField,UITextView。下面介紹一些文字處理的基本概念。
-
marked text
對(duì)于多步驟(multistage)的文字輸入來說,有一些文字是已經(jīng)輸入在文本框里,卻還沒有點(diǎn)擊確認(rèn),這些文字叫做marked text。中文有,日文也比較常見。
marked text -
UITextPosition和UITextRange
遵守UITextInput協(xié)議的類都要?jiǎng)?chuàng)建這兩個(gè)類的子類。為什么不用NSRange和NSInteger呢。用來表示文字的位置和范圍。
如何轉(zhuǎn)化NSRange和NSInteger?
- UITextPosition to nsinteger
func offset(from: UITextPosition, to toPosition: UITextPosition) -> Int
- UITextPosition to UITextRange
func textRange(from fromPosition: UITextPosition, to toPosition: UITextPosition) -> UITextRange?
- nsinteger to UITextPosition
NSInteger startOffset = [tv offsetFromPosition:tv.beginningOfDocument toPosition:start];
- 坐標(biāo)位置和UITextRange的轉(zhuǎn)換
-
func characterRange(at point: CGPoint) -> UITextRange?
根據(jù)坐標(biāo)系中點(diǎn)的位置,返回一個(gè)包含了點(diǎn)所處的character的UITextRange。為啥不是一個(gè)UITextPosition,因?yàn)橐粋€(gè)character會(huì)占據(jù)多個(gè)字符寬度,如emoji表情。
如果那個(gè)位置沒有文字,返回nil。
-
func closestPosition(to point: CGPoint) -> UITextPosition?
根據(jù)點(diǎn)來找到距離這個(gè)點(diǎn)最近的而一個(gè)UITextPosition。如果這個(gè)點(diǎn)在第二行行位,而第二行只有一個(gè)字,可能定位到上面一行的最末。。

