全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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  # 开发之UITextField的光标操作扩展  # UITextField光标  # iOS通过Runtime实现友盟统计的实例代码  # 详解iOS 裁剪圆形图像并显示(类似于微信头像)  # iOS实时录音和播放功能  # 简单谈谈axios中的get  # post方法  # 详解Vue 2.0封装axios笔记  # IOS 长链接与短链接之间的转换  # safari调试iOS app web页面的步骤  # 出了  # 也要  # 我们可以  # 而不  # 这就  # 希望能  # 然后再  # 可以直接  # 谢谢大家  # 先把  # 时要  # 来实现  # 创建一个  # 计算机应用  # 跳过  # 计算出  # 上要  # 再重新  # 不包含  # 有一个 


相关文章: 如何高效完成独享虚拟主机建站?  建站之星安装后界面空白如何解决?  如何有效防御Web建站篡改攻击?  如何在建站主机中优化服务器配置?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  ,制作一个手机app网站要多少钱?  网站制作公司排行榜,抖音怎样做个人官方网站  已有域名能否直接搭建网站?  如何使用Golang安装API文档生成工具_快速生成接口文档  郑州企业网站制作公司,郑州招聘网站有哪些?  如何用好域名打造高点击率的自主建站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  建站VPS能否同时实现高效与安全翻墙?  建站之星上传入口如何快速找到?  如何选择PHP开源工具快速搭建网站?  电商网站制作公司有哪些,1688网是什么意思?  如何在IIS管理器中快速创建并配置网站?  如何通过建站之星自助学习解决操作问题?  高防服务器租用如何选择配置与防御等级?  如何在服务器上配置二级域名建站?  中山网站制作网页,中山新生登记系统登记流程?  建站之星如何助力企业快速打造五合一网站?  盐城做公司网站,江苏电子版退休证办理流程?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何打造高效商业网站?建站目的决定转化率  如何用y主机助手快速搭建网站?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  python的本地网站制作,如何创建本地站点?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  公众号网站制作网页,微信公众号怎么制作?  IOS倒计时设置UIButton标题title的抖动问题  北京网站制作的公司有哪些,北京白云观官方网站?  建站之星3.0如何解决常见操作问题?  建站主机CVM配置优化、SEO策略与性能提升指南  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  已有域名如何免费搭建网站?  重庆市网站制作公司,重庆招聘网站哪个好?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何高效利用200m空间完成建站?  网站企业制作流程,用什么语言做企业网站比较好?  如何快速上传自定义模板至建站之星?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  建站为何优先选择香港服务器?  如何在橙子建站中快速调整背景颜色?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。