溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IOS中如何實(shí)現(xiàn)UITextField的光標(biāo)操作擴(kuò)展

發(fā)布時(shí)間:2021-07-09 09:30:18 來(lái)源:億速云 閱讀:227 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

小編給大家分享一下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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI