当前位置: 首页 > 编程笔记 >

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

裴浩歌
2023-03-14
本文向大家介绍IOS 开发之UITextField的光标操作扩展,包括了IOS 开发之UITextField的光标操作扩展的使用技巧和注意事项,需要的朋友参考一下

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 开发之NSURL基本操作,包括了IOS 开发之NSURL基本操作的使用技巧和注意事项,需要的朋友参考一下 IOS 开发之NSURL基本操作 NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以封装一个NSURL,操作很方便: 结果

  • 本文向大家介绍IOS 开发之swift中UIView的扩展使用的实例,包括了IOS 开发之swift中UIView的扩展使用的实例的使用技巧和注意事项,需要的朋友参考一下 IOS 开发之swift中UIView的扩展使用的实例 扩展类代码: 使用效果图: 使用示例: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本的支持!

  • 当我单击uitextfield时,如何在uitextfield中向右移动和显示光标3个空格。我使uitextfield变成圆角,并将约束从Main.Storyboard左“10”放置,当我单击uitextfield时,光标显示在uitextfield之外。下面是swift代码。

  • 问题内容: 当我运行以下servlet时: 我得到以下异常: 服务器上面的日志显示,行号28是导致异常的原因。但是我无法得到例外的原因。表中的所有列的数据类型均为varchar。 我已在Servlet代码中突出显示了行号28 (根据服务器日志的异常原因) 。 问题答案: 您应该首先使用该语句。 更新 正如Java 6文档所说 ResultSet游标最初位于第一行之前;第一个对方法的调用接下来使第一

  • 本文向大家介绍Android开发之Adobe flash操作工具类,包括了Android开发之Adobe flash操作工具类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发之Adobe flash操作工具类。分享给大家供大家参考,具体如下: 更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总

  • 本文向大家介绍Thinkphp 框架扩展之类库扩展操作详解,包括了Thinkphp 框架扩展之类库扩展操作详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Thinkphp 框架扩展之类库扩展操作。分享给大家供大家参考,具体如下: 类库扩展 ThinkPHP的类库主要包括公共类库和应用类库,都是基于命名空间进行定义和扩展的。只要按照规范定义,都可以实现自动加载。 公共类库 公共类库通常是