亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IOS中如何實現UITextField的光標操作擴展

發布時間:2021-07-09 09:30:18 來源:億速云 閱讀:230 作者:小新 欄目:移動開發

小編給大家分享一下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中如何實現UITextField的光標操作擴展”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澄江县| 祁阳县| 石狮市| 宣武区| 同心县| 黎城县| 贵阳市| 弋阳县| 深泽县| 册亨县| 胶州市| 英吉沙县| 阳西县| 昔阳县| 西平县| 安平县| 乐陵市| 平凉市| 桐庐县| 鲁山县| 临潭县| 大名县| 玉环县| 胶南市| 汶上县| 宝应县| 卢湾区| 敖汉旗| 会宁县| 盖州市| 曲阳县| 洛扎县| 什邡市| 徐汇区| 五家渠市| 陆良县| 青川县| 三穗县| 五原县| 大渡口区| 安义县|