国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

IOS 開發之UITextField的光標操作擴展

2019-10-21 18:45:49
字體:
來源:轉載
供稿:網友

IOS 開發之UITextField的光標操作擴展

簡介

在iOS開發中,有時候需要完全自主的定義鍵盤,用于完整的單詞輸入,例如計算機應用中,需要一次性的輸入sin(,在移動光標時要完整的跳過sin(,在刪除時也要完整的刪除,這就需要對光標的位置進行精確控制,而ios并沒有相關的函數可以直接操作光標,只給出了選擇某個區域的功能,本文將介紹基于區域選擇設計的UITextField擴展,用于獲取光標位置以及移動光標。

實現原理

光標位置的獲取

在textField中,有一個屬性稱之為selectedTextRange,這個屬性為UITextRange類型,包含[start,end)兩個值,通過實驗我們可以發現,在沒有文字被選取時,start代表當前光標的位置,而end=0;當有區域被選擇時,start和end分別是選擇的頭和尾的光標位置,從0開始,并且不包含end,例如選擇了0~3的位置,則start=0,end=4。

光標的移動

通過setSelectedTextRange:方法可以設置選取范圍,我們只要設置一個選取單個字符的范圍,即可移動光標而不選中。

關鍵屬性

// 內容為[start,end),無論是否有選取區域,start都描述了光標的位置。@property (nullable, readwrite, copy) UITextRange *selectedTextRange;// 文首和文尾的位置@property (nonatomic, readonly) UITextPosition *beginningOfDocument;@property (nonatomic, readonly) UITextPosition *endOfDocument;

關鍵方法

// 獲取以from為基準的to的偏移,例如abcde,光標在c后,則光標相對文尾的偏移為-2。- (NSInteger)offsetFromPosition:(UITextPosition *)from toPosition:(UITextPosition *)toPosition;// 獲取以from為基準偏移offset的光標位置。- (nullable UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset;// 創建一個UITextRange- (nullable UITextRange *)textRangeFromPosition:(UITextPosition *)fromPosition toPosition:(UITextPosition *)toPosition;

具體實現

下面的代碼為UITextField創建了一個分類(Category),包含三個方法,分別用于獲取光標位置、從當前位置偏移、從頭偏移。

#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{  // 基于文首計算出到光標的偏移數值。  return [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];}- (void)makeOffset:(NSInteger)offset{  // 實現原理是先獲取一個基于文尾的偏移,然后加上要施加的偏移,再重新根據文尾計算位置,最后利用選取來實現光標定位。  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{  // 先把光標移動到文首,然后再調用上面實現的偏移函數。  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

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临泽县| 通山县| 台南市| 剑阁县| 白城市| 扎囊县| 保康县| 交口县| 榕江县| 陆良县| 乌鲁木齐县| 平安县| 明溪县| 瑞金市| 江源县| 霍邱县| 上犹县| 罗甸县| 延寿县| 阿克陶县| 离岛区| 遂昌县| 富平县| 崇礼县| 溧阳市| 长乐市| 林周县| 东港市| 德安县| 长泰县| 诸城市| 深圳市| 洞口县| 五指山市| 白玉县| 永春县| 崇阳县| 合川市| 克什克腾旗| 多伦县| 柘城县|