UITextView 200字符限制,中文算1个字,英文算0.5个字
2015-07-02 11:28
423 查看
//注册监听方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewChanged:) name:UITextViewTextDidChangeNotification object:self.replyTextView];
/**
* 计算输入的字数,超出规定字数不允许输入
*
* @param noti 通知
*/
- (void)textViewChanged:(NSNotification *)noti
{
NSString * textContent = self.replyTextView.text;
int existTextNum = [textContent lengthForCString];;
NSString *language = [self.replyTextView.textInputMode primaryLanguage];
if ([language isEqualToString:@"zh-Hans"])
{
//中文
UITextRange * selectedRange = [self.replyTextView markedTextRange];
UITextPosition * position = [self.replyTextView positionFromPosition:selectedRange.start offset:0];
if (!position) {
//没有选中字符
if (existTextNum > TextViewMaxLength)
{
//大于200字符
textContent = [textContent subStringWithByteLength:TextViewMaxLength];
existTextNum = TextViewMaxLength;
self.replyTextView.text =
textContent;
}else
{
//小于200字符
// existTextNum = [textContent lengthForCString];
}
}else
{
//有选中字符
// existTextNum = [textContent lengthForCString];
}
}else
{
//英文
// existTextNum = [textContent lengthForCString];
if (existTextNum > TextViewMaxLength)
{
//大于200字符
textContent = [textContent subStringWithByteLength:TextViewMaxLength];
existTextNum = TextViewMaxLength;
self.replyTextView.text =
textContent;
}
}
self.currentCountLabel.text =
[NSString stringWithFormat:@"%d",
existTextNum];
}
//下面这两个个都是分类里的方法,写个NSString的分类放里面用就可以了。
//这个方法从网上找的。
/**
* 计算字符串字节长度,中文一个字节,英文0.5字节
*
* @return 字节长度
*/
- (int)lengthForCString
{
int strlength = 0;
char * p = (char *)[self cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i
= 0; i < [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
i ++) {
// NSLog(@"*p:%c",*p);
if (* p) {
p ++;
strlength ++;
}
else {
p ++;
}
}
return (strlength + 1)/2;
}
//这个是自己写的。
/**
* 按字节数截取字符串,中文一个字节,英文0.5字节,如果最后字符是半个中文,自动抛掉最后一个字符
*
* @param length 字节数
*
* @return 截取后的字符串
*/
- (NSString *)subStringWithByteLength:(int)length
{
float bytesCount = 0;
float lastBytesCount = 0;
for (int i
= 1; i <= self.length;
i ++) {
// NSLog(@"byteLength:%ld", [[self substringWithRange:NSMakeRange(i - 1, 1)] lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
if ([[self substringWithRange:NSMakeRange(i
- 1, 1)] lengthOfBytesUsingEncoding:NSUTF8StringEncoding]
== 3) {
bytesCount ++;
}else
{
bytesCount += 0.5;
}
if (bytesCount > length) {
// NSLog(@"byteCount:%f", lastBytesCount);
return [self substringWithRange:NSMakeRange(0,
i - 1)];
}else if (bytesCount == length)
{
return [self substringWithRange:NSMakeRange(0,
i)];
}else
{
lastBytesCount = bytesCount;
}
}
return @"按字节截取字符串出错,请检查截取字节是否超出范围。";
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewChanged:) name:UITextViewTextDidChangeNotification object:self.replyTextView];
/**
* 计算输入的字数,超出规定字数不允许输入
*
* @param noti 通知
*/
- (void)textViewChanged:(NSNotification *)noti
{
NSString * textContent = self.replyTextView.text;
int existTextNum = [textContent lengthForCString];;
NSString *language = [self.replyTextView.textInputMode primaryLanguage];
if ([language isEqualToString:@"zh-Hans"])
{
//中文
UITextRange * selectedRange = [self.replyTextView markedTextRange];
UITextPosition * position = [self.replyTextView positionFromPosition:selectedRange.start offset:0];
if (!position) {
//没有选中字符
if (existTextNum > TextViewMaxLength)
{
//大于200字符
textContent = [textContent subStringWithByteLength:TextViewMaxLength];
existTextNum = TextViewMaxLength;
self.replyTextView.text =
textContent;
}else
{
//小于200字符
// existTextNum = [textContent lengthForCString];
}
}else
{
//有选中字符
// existTextNum = [textContent lengthForCString];
}
}else
{
//英文
// existTextNum = [textContent lengthForCString];
if (existTextNum > TextViewMaxLength)
{
//大于200字符
textContent = [textContent subStringWithByteLength:TextViewMaxLength];
existTextNum = TextViewMaxLength;
self.replyTextView.text =
textContent;
}
}
self.currentCountLabel.text =
[NSString stringWithFormat:@"%d",
existTextNum];
}
//下面这两个个都是分类里的方法,写个NSString的分类放里面用就可以了。
//这个方法从网上找的。
/**
* 计算字符串字节长度,中文一个字节,英文0.5字节
*
* @return 字节长度
*/
- (int)lengthForCString
{
int strlength = 0;
char * p = (char *)[self cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i
= 0; i < [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
i ++) {
// NSLog(@"*p:%c",*p);
if (* p) {
p ++;
strlength ++;
}
else {
p ++;
}
}
return (strlength + 1)/2;
}
//这个是自己写的。
/**
* 按字节数截取字符串,中文一个字节,英文0.5字节,如果最后字符是半个中文,自动抛掉最后一个字符
*
* @param length 字节数
*
* @return 截取后的字符串
*/
- (NSString *)subStringWithByteLength:(int)length
{
float bytesCount = 0;
float lastBytesCount = 0;
for (int i
= 1; i <= self.length;
i ++) {
// NSLog(@"byteLength:%ld", [[self substringWithRange:NSMakeRange(i - 1, 1)] lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
if ([[self substringWithRange:NSMakeRange(i
- 1, 1)] lengthOfBytesUsingEncoding:NSUTF8StringEncoding]
== 3) {
bytesCount ++;
}else
{
bytesCount += 0.5;
}
if (bytesCount > length) {
// NSLog(@"byteCount:%f", lastBytesCount);
return [self substringWithRange:NSMakeRange(0,
i - 1)];
}else if (bytesCount == length)
{
return [self substringWithRange:NSMakeRange(0,
i)];
}else
{
lastBytesCount = bytesCount;
}
}
return @"按字节截取字符串出错,请检查截取字节是否超出范围。";
}
相关文章推荐
- 前端优化:RequireJS Optimizer 的使用和配置方法(二)
- 前端优化:RequireJS Optimizer 的使用和配置方法(一)
- 动态计算UITableViewCell高度详解 -- 学习
- Visual Studio 中项目文件属性的Build action 设置
- BaiduMap---百度地图官方Demo之UI控制功能(介绍开关手势功能和显示隐藏UI控件)
- soapui 免费版 实现 datasource+ dataLoop
- Guice 学习(九) WEB AND SERVLET
- ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun
- easy ui tree 默认选中指定行
- UIlabel特殊属性的使用
- UILabel特殊属性的使用
- 简述Java中,GUI的事件驱动模式
- 长时间停留在calculating requirements and dependencies 的解决方案
- 代码实现 UITableView与UITableViewCell
- ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun
- 线程——委托InvokeRequired和Invoke
- Build Action 设置为 Embedded Resource
- UI7法则
- 用 requirejs 的 R.js 打包css + js
- 1041. Be Unique (20)