iOS基于UITextView的字数限制和输入量显示

2023-11-29 06:58

本文主要是介绍iOS基于UITextView的字数限制和输入量显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#define MAX_LIMIT_NUMS 50
//显示输入字数和限制数_textNumLab = [[UILabel alloc] init];_textNumLab.font = GetFont(FONT_BUTTON);_textNumLab.text = @"0/50";_textNumLab.textAlignment = 2;[self addSubview:_textNumLab];#pragma mark -限制病情描述输入字数(最多不超过MAX_LIMIT_NUMS个字)
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{//不支持系统表情的输入if ([[textView textInputMode]primaryLanguage]==nil||[[[textView textInputMode]primaryLanguage]isEqualToString:@"emoji"]) {return NO;}UITextRange *selectedRange = [textView markedTextRange];//获取高亮部分UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];//获取高亮部分内容//NSString * selectedtext = [textView textInRange:selectedRange];//如果有高亮且当前字数开始位置小于最大限制时允许输入if (selectedRange && pos) {NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];NSRange offsetRange =NSMakeRange(startOffset, endOffset - startOffset);if (offsetRange.location <MAX_LIMIT_NUMS) {return YES;}else{return NO;}}NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];NSInteger caninputlen =MAX_LIMIT_NUMS - comcatstr.length;if (caninputlen >=0){return YES;}else{NSInteger len = text.length + caninputlen;//防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错NSRange rg = {0,MAX(len,0)};if (rg.length >0){NSString *s =@"";//判断是否只普通的字符或asc码(对于中文和表情返回NO)BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];if (asc) {s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错}else{__block NSInteger idx =0;__block NSString  *trimString =@"";//截取出的字串//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个[text enumerateSubstringsInRange:NSMakeRange(0, [text length])options:NSStringEnumerationByComposedCharacterSequencesusingBlock: ^(NSString* substring,NSRange substringRange,NSRange enclosingRange,BOOL* stop) {if (idx >= rg.length) {*stop =YES;//取出所需要就break,提高效率return ;}trimString = [trimString stringByAppendingString:substring];idx++;}];s = trimString;}//rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)[textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];//既然是超出部分截取了,哪一定是最大限制了。_textNumLab.text = [NSString stringWithFormat:@"%d/%ld",0,(long)MAX_LIMIT_NUMS];}return NO;}
}#pragma mark -显示当前可输入字数/总字数
- (void)textViewDidChange:(UITextView *)textView{UITextRange *selectedRange = [textView markedTextRange];if (_delegate && [_delegate respondsToSelector:@selector(didChangeValue:cell:)]) {[_delegate didChangeValue:textView.text cell:self];}//获取高亮部分UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];//如果在变化中是高亮部分在变,就不要计算字符了if (selectedRange && pos) {return;}NSString  *nsTextContent = textView.text;NSInteger existTextNum = nsTextContent.length;if (existTextNum >MAX_LIMIT_NUMS){//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];[textView setText:s];}//    //不让显示负数(倒计数)
//    _textNumLab.text = [NSString stringWithFormat:@"%ld/%d",MAX(0,MAX_LIMIT_NUMS - existTextNum),MAX_LIMIT_NUMS];
//正向计数_textNumLab.text = [NSString stringWithFormat:@"%ld/%d",MIN(50,existTextNum),MAX_LIMIT_NUMS];
}

效果图如下:
这里写图片描述

这篇关于iOS基于UITextView的字数限制和输入量显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431876

相关文章

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li