IOS 开发之UITextField的光标操作扩展

2025-05-29 0 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:方法可以设置选取范围,我们只要设置一个选取单个字符的范围,即可移动光标而不选中。

关键属性

?

1

2

3

4

5
// 内容为[start,end),无论是否有选取区域,start都描述了光标的位置。

@property (nullable, readwrite, copy) UITextRange *selectedTextRange;

// 文首和文尾的位置

@property (nonatomic, readonly) UITextPosition *beginningOfDocument;

@property (nonatomic, readonly) UITextPosition *endOfDocument;

关键方法

?

1

2

3

4

5

6
// 获取以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),包含三个方法,分别用于获取光标位置、从当前位置偏移、从头偏移。

?

1

2

3

4

5

6

7

8

9
#import <UIKit/UIKit.h>

@interface UITextField (Extension)

- (NSInteger)curOffset;

- (void)makeOffset:(NSInteger)offset;

- (void)makeOffsetFromBeginning:(NSInteger)offset;

@end

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34
#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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 IOS 开发之UITextField的光标操作扩展 https://www.kuaiidc.com/90929.html

相关文章

发表评论
暂无评论