textView中判断文本长度,自定义表情长度为1,emoj表情长度为1,输入限制
static const int MAX_LIMIT_NUMS = 100; /**< 输入个数限制 */
// self.inputNumberTipsLabel 控制器的view上一个用于展示输入数量提示的一个label
#pragma mark - UITextViewDelegate - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text
{
UITextRange *selectedRange1 = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange1.start offset:];
//获取高亮部分内容
//NSString * selectedtext = [textView textInRange:selectedRange]; //如果有高亮且当前字数开始位置小于最大限制时允许输入
if (selectedRange1 && pos) {
NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange1.start];
NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange1.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;
NSInteger caninputlen = MAX_LIMIT_NUMS - [comcatstr getStringLengthIfIsEmojiLengthAsOne]; if (caninputlen >= )
{
return YES;
}
else
{
// NSInteger len = text.length + caninputlen;
NSInteger len = [text getStringLengthIfIsEmojiLengthAsOne] + caninputlen; //防止当text.length + caninputlen < 0时,使得rg.length为一个非法最大正数出错
NSRange rg = {,MAX(len,)}; if (rg.length > )
{
NSString *s = @"";
//判断是否只普通的字符或asc码(对于中文和表情返回NO)
BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];
if (asc) {
s = [text substringWithRange:rg];//因为是ascii码直接取就可以了不会错
}
else
{
__block NSInteger idx = ;
__block NSString *trimString = @"";//截取出的字串
//使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个
[text enumerateSubstringsInRange:NSMakeRange(, [text length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
// NSInteger steplen = substring.length;
NSInteger steplen = [substring getStringLengthIfIsEmojiLengthAsOne]; if (idx >= rg.length) {
*stop = YES; //取出所需要就break,提高效率
return ;
} trimString = [trimString stringByAppendingString:substring]; idx = idx + steplen;
}]; s = trimString;
} __block BOOL hasAttachment = NO;
[textView.attributedText enumerateAttributesInRange:NSMakeRange(, textView.attributedText.length) options:NSAttributedStringEnumerationReverse usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { if(attrs[@"NSAttachment"])
{
*stop = YES;
hasAttachment = YES;
}
}]; if (textView.text.length > MAX_LIMIT_NUMS) {
kToastWithString(@"输入已达上限")
if (hasAttachment) { [textView.attributedText attributedSubstringFromRange:NSMakeRange(, MAX_LIMIT_NUMS)]; } else { //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件)
[textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];
}
} //既然是超出部分截取了,哪一定是最大限制了。
self.inputNumberTipsLabel.text = [NSString stringWithFormat:@"%d/%ld",,(long)MAX_LIMIT_NUMS];
}
if (textView.text.length >= MAX_LIMIT_NUMS) {
kToastWithString(@"输入已达上限")
}
return NO;
} } - (void)textViewDidChange:(UITextView *)textView
{
// 占位文本显示与否
_submitEvaluationBtn.enabled = self.evaluationTextView.hasText; UITextRange *selectedRange1 = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange1.start offset:]; //如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange1 && pos) {
return;
} NSString *nsTextContent = textView.text;
// NSInteger existTextNum = nsTextContent.length;
NSInteger existTextNum = [nsTextContent getStringLengthIfIsEmojiLengthAsOne]; if (existTextNum >= MAX_LIMIT_NUMS)
{
kToastWithString(@"输入已达上限")
__block BOOL hasAttachment = NO;
[textView.attributedText enumerateAttributesInRange:NSMakeRange(, textView.attributedText.length) options:NSAttributedStringEnumerationReverse usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { if(attrs[@"NSAttachment"])
{
*stop = YES;
hasAttachment = YES;
}
}]; if (hasAttachment) { textView.attributedText = [textView.attributedText attributedSubstringFromRange:NSMakeRange(, MAX_LIMIT_NUMS + [textView.text emojiCount])]; } else {
//截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断)
NSString *s = [nsTextContent substringToIndex:(MAX_LIMIT_NUMS + [textView.text emojiCount])]; [textView setText:s];
}
} //不让显示负数 口口日
self.inputNumberTipsLabel.text = [NSString stringWithFormat:@"%tu/%tu",MAX(,MAX_LIMIT_NUMS - existTextNum),MAX_LIMIT_NUMS];
}
textView中判断文本长度,自定义表情长度为1,emoj表情长度为1,输入限制的更多相关文章
- JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!
JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...
- Android TextView中实现点击文本超链接(无下划线)的封装类
android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作.比如新浪微博上的一些keyword,点击时会跳转到对应的页面. 怎样实现我们就直接看源代码吧. /** * ...
- Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...
- android中用Spannable在TextView中设置超链接、颜色、字体
昨晚研读 ApiDemo 源码至 com.example.android.apis.text.Link 类.首先,看一下其运行效果: 要给 TextView 加上效果,方式主要有几种: 第一种,自动 ...
- 【Swift】图文混排,ios开发中在textfield或textView中插入图片
在ios开发中,我们一般都是在textfield或者textView中输入文字.当我们需要插入图片的时候其实也是很简单的 我们需要利用的textfield,textView的属性化文本,将图片以附件的 ...
- TextView之富文本
项目中使用富文本比较常见了,一行显示多种样式颜色的文本,使用 ClickableSpan 富文本实现在同一个 TextView 中的文本的颜色.大小.背景色等属性的多样化和个性化. 我们也可以使用Ht ...
- vim中对文本的选择
本文主要解说vim中对文本的选择,vim中选择文本分为: (1)选择字符 ---- 命令行模式下输入小写v (2)选择行 ---- 命令行模式下输入大写V (3)选择块 ---- ...
- froms中判断数据长度自定义提示
class NumberForm(BaseForm): querynumber = forms.CharField(error_messages={'required':u'请输入手机号'}) def ...
- IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度
在一些项目中,我们需要自定义自己的UIButton,使Button上面同时具有图片和文字描述,实现自定义UIButton的图文混排. 首先我们需要定义一个继承自UIButton的类,同时实现自己的in ...
随机推荐
- QT QString类
字符串有如下几个操作符 QString提供了一个二元的"+"操作符用于组合两个字符串,并提供了一个"+="操作符用于将一个字符串追加到另一个字符串的末尾,例如: ...
- HTML基础 - <base>标签的使用
标签对于不是很熟悉前端的人应该还算是个生面孔吧,粗略讲讲标签的用法. 将相对路径变成绝对路径 这个对于需要借(chao)鉴(xi)别人网页的时候特别有用~ 批量设置target=_blank 当需要对 ...
- echo "scale=100; a(1)*4" | bc -l 输出圆周率
突然看到echo "scale=100; a(1)*4" | bc -l可以输出圆周率,很惊奇,后来发现很简单. 首先bc是“basic calculator”的缩写,就是初级的计 ...
- iOS中偏好设置的创建,数据写入与读取
NSUserDefaults与NSDictinary? 应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样,不同之处在于N ...
- IOS开发之——OpenUDID的使用获取用户唯一设备
下载网址:https://github.com/ylechelle/OpenUDID OpenUDID测试结果分析 1)优点: a.没有用到MAC地址.MAC地址跟UDID一样,存在隐私问题.不能保证 ...
- Jenkins进阶系列之——01使用email-ext替换Jenkins的默认邮件通知
1 简述 众所周知,Jenkins默认提供了一个邮件通知,能在构建失败.构建不稳定等状态后发送邮件.但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容.无法定义发送邮件的格式.无法定义灵活 ...
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
注意:绝对路径用/开头 绝对路径:/root/.jenkins/jobs/test/workspace/bbb/test.war 相对路径:bbb/test.war 点我下载
- sql server 2008 基础知识
一.配置管理器 1.管理服务 使用配置管理器可以启动.停止.重新启动.继续或暂停服务. 服务器和客户端网络协议 2.SQLSMS 简介:SQLSMS是一个集成环境,用于访问.配置.管理和开发SQL ...
- jQuery UI dialog
初始化参数 对于 dialog 来说,首先需要进行初始化,在调用 dialog 函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框. 没有参数,表示按照默认的设置初始化对话 ...
- Bootstrap3.0学习第十八轮(JavaScript插件——下拉菜单)
详情请查看 http://aehyok.com/Blog/Detail/25.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...