小編給大家分享一下IOS中如何實(shí)現(xiàn)UITextField的光標(biāo)操作擴(kuò)展,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、撫順網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為撫順等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。簡(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è)屬性稱(chēng)之為selectedTextRange,這個(gè)屬性為UITextRange類(lèi)型,包含[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è)分類(lèi)(Category),包含三個(gè)方法,分別用于獲取光標(biāo)位置、從當(dāng)前位置偏移、從頭偏移。
#import@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)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。