IOS 開(kāi)發(fā)之UITextField的光標(biāo)操作擴(kuò)展
IOS 開(kāi)發(fā)之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è)屬性稱(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 <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ì)本站的支持!
相關(guān)文章
NSString屬性何時(shí)用strong何時(shí)用copy?
相信各位iOS開(kāi)發(fā)者們都考慮過(guò)這個(gè)問(wèn)題,平時(shí)寫(xiě)NSString的屬性時(shí)都用copy,那strong要何時(shí)用呢?下面這篇文章就來(lái)看一下什么時(shí)候應(yīng)該用copy,什么時(shí)候應(yīng)該用strong。有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12iOS NSCache和NSUrlCache緩存類(lèi)實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了iOS NSCache和NSUrlCache緩存類(lèi)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫(kù)處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開(kāi)連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05iOS實(shí)現(xiàn)UIScrollView的無(wú)限輪播功能(原理)詳解
在現(xiàn)在的一些App中常常見(jiàn)到圖片輪播器,一般用于展示廣告、新聞等數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)UIScrollView的無(wú)限輪播功能(原理)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法
這里來(lái)為大家詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法,分別使用MPMoviePlayerControlle和MPMediaPickerController來(lái)實(shí)現(xiàn),兩個(gè)都是MediaPlayer.framework中的多媒體組件,所以我們放到一起來(lái)講.2016-06-06iOS 水波紋動(dòng)畫(huà)的實(shí)現(xiàn)效果
本篇文章主要介紹了iOS 水波紋的實(shí)現(xiàn)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01支持Xcode10和適配iPhone XS Max、iPhone XR的方法
這篇文章主要介紹了支持Xcode10和適配iPhone XS Max、iPhone XR的方法,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10