您好,登錄后才能下訂單哦!
小編給大家分享一下IOS中如何實(shí)現(xiàn)UITextField的光標(biāo)操作擴(kuò)展,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
簡(jiǎn)介
在iOS開(kāi)發(fā)中,有時(shí)候需要完全自主的定義鍵盤(pán),用于完整的單詞輸入,例如計(jì)算機(jī)應(yīng)用中,需要一次性的輸入sin(,在移動(dòng)光標(biāo)時(shí)要完整的跳過(guò)sin(,在刪除時(shí)也要完整的刪除,這就需要對(duì)光標(biāo)的位置進(jìn)行精確控制,而ios并沒(méi)有相關(guān)的函數(shù)可以直接操作光標(biāo),只給出了選擇某個(gè)區(qū)域的功能,本文將介紹基于區(qū)域選擇設(shè)計(jì)的UITextField擴(kuò)展,用于獲取光標(biāo)位置以及移動(dòng)光標(biāo)。
實(shí)現(xiàn)原理
光標(biāo)位置的獲取
在textField中,有一個(gè)屬性稱之為selectedTextRange,這個(gè)屬性為UITextRange類型,包含[start,end)兩個(gè)值,通過(guò)實(shí)驗(yàn)我們可以發(fā)現(xiàn),在沒(méi)有文字被選取時(shí),start代表當(dāng)前光標(biāo)的位置,而end=0;當(dāng)有區(qū)域被選擇時(shí),start和end分別是選擇的頭和尾的光標(biāo)位置,從0開(kāi)始,并且不包含end,例如選擇了0~3的位置,則start=0,end=4。
光標(biāo)的移動(dòng)
通過(guò)setSelectedTextRange:方法可以設(shè)置選取范圍,我們只要設(shè)置一個(gè)選取單個(gè)字符的范圍,即可移動(dòng)光標(biāo)而不選中。
關(guān)鍵屬性
// 內(nèi)容為[start,end),無(wú)論是否有選取區(qū)域,start都描述了光標(biāo)的位置。 @property (nullable, readwrite, copy) UITextRange *selectedTextRange; // 文首和文尾的位置 @property (nonatomic, readonly) UITextPosition *beginningOfDocument; @property (nonatomic, readonly) UITextPosition *endOfDocument;
關(guān)鍵方法
// 獲取以from為基準(zhǔn)的to的偏移,例如abcde,光標(biāo)在c后,則光標(biāo)相對(duì)文尾的偏移為-2。 - (NSInteger)offsetFromPosition:(UITextPosition *)from toPosition:(UITextPosition *)toPosition; // 獲取以from為基準(zhǔn)偏移offset的光標(biāo)位置。 - (nullable UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset; // 創(chuàng)建一個(gè)UITextRange - (nullable UITextRange *)textRangeFromPosition:(UITextPosition *)fromPosition toPosition:(UITextPosition *)toPosition;
具體實(shí)現(xiàn)
下面的代碼為UITextField創(chuàng)建了一個(gè)分類(Category),包含三個(gè)方法,分別用于獲取光標(biāo)位置、從當(dāng)前位置偏移、從頭偏移。
#import <UIKit/UIKit.h> @interface UITextField (Extension) - (NSInteger)curOffset; - (void)makeOffset:(NSInteger)offset; - (void)makeOffsetFromBeginning:(NSInteger)offset; @end
#import "UITextField+Extension.h" @implementation UITextField (Extension) - (NSInteger)curOffset{ // 基于文首計(jì)算出到光標(biāo)的偏移數(shù)值。 return [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start]; } - (void)makeOffset:(NSInteger)offset{ // 實(shí)現(xiàn)原理是先獲取一個(gè)基于文尾的偏移,然后加上要施加的偏移,再重新根據(jù)文尾計(jì)算位置,最后利用選取來(lái)實(shí)現(xiàn)光標(biāo)定位。 UITextRange *selectedRange = [self selectedTextRange]; NSInteger currentOffset = [self offsetFromPosition:self.endOfDocument toPosition:selectedRange.end]; currentOffset += offset; UITextPosition *newPos = [self positionFromPosition:self.endOfDocument offset:currentOffset]; self.selectedTextRange = [self textRangeFromPosition:newPos toPosition:newPos]; } - (void)makeOffsetFromBeginning:(NSInteger)offset{ // 先把光標(biāo)移動(dòng)到文首,然后再調(diào)用上面實(shí)現(xiàn)的偏移函數(shù)。 UITextPosition *begin = self.beginningOfDocument; UITextPosition *start = [self positionFromPosition:begin offset:0]; UITextRange *range = [self textRangeFromPosition:start toPosition:start]; [self setSelectedTextRange:range]; [self makeOffset:offset]; } @end
看完了這篇文章,相信你對(duì)“IOS中如何實(shí)現(xiàn)UITextField的光標(biāo)操作擴(kuò)展”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。