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

相关文章

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

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