IOS开发之——意见反馈UITextView的使用+不能输入字符输入
@interface DMFeedbackViewController ()<UITextViewDelegate,UIAlertViewDelegate>
@property (nonatomic, strong) UITextView *feedbackTextView;//意见反馈输入框
@property (nonatomic, strong) UILabel *mostLabel;//最多还可以输入
@property (nonatomic, strong) UIButton *submitBt;//提交
@property (nonatomic, strong) UILabel *feedbackNoteLabel;//在此输入反馈意见
@end
判断用户是否输入文字,feedbackNoteLabel文字显示或者隐藏
利用通知解决:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewChange) name:UITextViewTextDidChangeNotification object:nil];
//释放通知
-(void)dealloc
{
// debugMethod();
[[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
}
-(void)textViewChange
{
if (_feedbackTextView.text.length== 0) {
[_feedbackNoteLabel setHidden:NO];
}else
{
[_feedbackNoteLabel setHidden:YES];
}
}
由于设计需要,uitextview的输入框特别长,提交按钮在最底部,为了方便用户体验,添加了拖拽也就是滑动手势
UIPanGestureRecognizer *panGestureRecognizer= [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestures:)];
panGestureRecognizer.minimumNumberOfTouches = 1;
panGestureRecognizer.maximumNumberOfTouches = 5;
[self.view addGestureRecognizer:panGestureRecognizer];
#pragma mark --滑动空白区域收起键盘
-(void)handlePanGestures:(UIPanGestureRecognizer *)sender{
[self.view endEditing:YES];
}
####您最多还可以输入多个字的代理方法
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSString *temp = [textView.text stringByReplacingCharactersInRange:range withString:text];
if (temp.length== 0) {
//输入文字为0,提交按钮触摸事件隐藏
[_submitBt setBackgroundColor:DMRGB(235, 235, 240)];
[_submitBt setTitleColor:DMRGB(210, 210, 210) forState:UIControlStateNormal];
_submitBt.userInteractionEnabled = NO;
}
else
{
[_submitBt setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_submitBt.backgroundColor = [UIColor colorWithRed:65.0/255 green:109.0/255 blue:218.0/255 alpha:1];
_submitBt.userInteractionEnabled = YES;
}
NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
_mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMRGB(153, 153, 153) otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];
if (temp.length >= 100) { //如果输入超过规定的字数100,就不再让输入
return NO;
}
return YES;
}
-(NSMutableAttributedString*)getString:(NSString*)str WithFontSize:(CGFloat)fontSize WithTextColer:(UIColor *)color otherTextColer:(UIColor *)othercolor WithRange:(NSRange)strRange
{
NSMutableAttributedString *attriString = [[NSMutableAttributedString alloc] initWithString:str];
NSRange mainRange=NSMakeRange(0, str.length);
[attriString setAttributes: @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize],
NSForegroundColorAttributeName: color} range:mainRange];
[attriString setAttributes: @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize],
NSForegroundColorAttributeName: othercolor} range:strRange];
return attriString;
}
本来以为解决了,结果测试发现了一个问题:当输入拼音的时候,那个提示语100并没有被减去。
百度了资料说:
这样在输入全部是英文的情况下是可以的. 但是当输入是中文时, 由于shouldChangeCharactersInRange判断的是当前键盘的字符数,最终采用了通知方法解决。
方法如下:
把那个shouldChangeCharactersInRange方法注释掉。代码如下:
- (void)initParameters
{
[super initParameters];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewChange) name:UITextViewTextDidChangeNotification object:nil];
//关于输入拼音和英文状态下如何正确的统计输入的文字字数
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewEditChange:) name:UITextViewTextDidChangeNotification object:_feedbackTextView];
}
-(void)dealloc
{
// debugMethod();
[[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:UITextViewTextDidChangeNotification object:_feedbackTextView];
}
#pragma mark 通知 方法
-(void)textViewChange
{
if (_feedbackTextView.text.length== 0) {
[_feedbackNoteLabel setHidden:NO];
}else
{
[_feedbackNoteLabel setHidden:YES];
}
}
//关于输入拼音和英文状态下如何正确的统计输入的文字字数
-(void)textViewEditChange:(NSNotification *)obj{
UITextView *textView = (UITextView *)obj.object;
NSString *temp = textView.text;
if (temp.length== 0) {
[_submitBt setBackgroundColor:DMRGB(235, 235, 240)];
[_submitBt setTitleColor:DMRGB(210, 210, 210) forState:UIControlStateNormal];
_submitBt.userInteractionEnabled = NO;
}
else
{
[_submitBt setTitleColor:DMRGB(255, 255, 255) forState:UIControlStateNormal];
_submitBt.backgroundColor = [UIColor colorWithRed:240.0/255 green:77.0/255 blue:77.0/255 alpha:1];
_submitBt.userInteractionEnabled = YES;
}
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
_mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMSecondaryTextColor otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
if (!position) { //如果没有高亮选择的字,则对已经输入的文字进行字数统计和限制
if (temp.length>100) {
textView.text = [temp substringToIndex:100];
}
}
else{ //有高亮选择的字,不对文字进行字数统计和限制
}
}
else{// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
NSString *str = [NSString stringWithFormat:@"%lu",100-temp.length];
_mostLabel.attributedText =[self getString:[NSString stringWithFormat:@"您最多还可以输入%lu个字",100-temp.length] WithFontSize:DMFontSize14 WithTextColer:DMSecondaryTextColor otherTextColer:DMRGB(237, 95, 95) WithRange:NSMakeRange(8,str.length)];
if (temp.length>100) { //超过最大字符100,不让键盘输入
textView.text = [temp substringToIndex:100];
}
}
}就可以了。
最后一步:关于emoji表情不能被输入,怎么解决?
如下:
#pragma mark - 代理 //用户完成编辑后所提示的事
-(void)textViewDidEndEditing:(UITextView *)textView{
if ([self stringContainsEmoji:self.feedbackTextView.text]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"不能带有表情符号,请输入中文" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
}
}
#pragma mark 判断NSString字符串是否包含emoji表情
- (BOOL)stringContainsEmoji:(NSString *)string{
__block BOOL returnValue = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue = YES;
}
}
} else if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3) {
returnValue = YES;
}
} else {
if (0x2100 <= hs && hs <= 0x27ff) {
returnValue = YES;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue = YES;
} else if (0x2934 <= hs && hs <= 0x2935) {
returnValue = YES;
} else if (0x3297 <= hs && hs <= 0x3299) {
returnValue = YES;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
returnValue = YES;
}
}
}];
return returnValue;
}
IOS开发之——意见反馈UITextView的使用+不能输入字符输入的更多相关文章
- iOS-意见反馈UITextView的使用+不能输入字符输入
@interface DMFeedbackViewController ()<UITextViewDelegate,UIAlertViewDelegate>@property (nonat ...
- iOS开发-带Placeholder的UITextView实现
iOS中UITextField带有PlaceHolder属性,可以方便用于提示输入.但是同样可以进行文本输入的UITextView控件则没有PlaceHolder属性,还是有些不方便的,尤其是对于略带 ...
- iOS 开发App捕获异常, 反馈给服务器, 提高用户体验
在我们开发的app中, 不可避免的, 有时候用户使用软件会崩溃. 我们就需要捕获异常, 可以在入口类中加入相应的代码, 可以在每次用户打开程序的时候, 检查一下沙盒中是否有崩溃日志, 如果有, 可以 ...
- iOS开发笔记12:iOS7上UITextField限制字数输入导致崩溃问题
在一些场景中,需要限制用户的输入字数,例如在textField里进行控制(textView也类似,崩溃原因也相同),如图所示 系统会监听文本输入,需要注意的第一点是输入法处于联想输入还未确定提交的时候 ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见
智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...
- 《iOS开发指南》要改iOS8版本了,听听您的意见?
<iOS开发指南>要改iOS8版本了,听听您的意见?参加问卷同学均可获得智捷课堂50元代金卡一张,同时抽取一名同学赠送即将出版的基于iOS8的<iOS开发指南>一本,欢迎大家填 ...
- iOS开发-UITextView根据内容自适应高度
UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: -(UITextView * ...
- iOS:iOS开发非常全的三方库、插件等等
iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...
随机推荐
- Android中有时候运行程序的时候会报错:An internal error occurred during:。。。。
解决办法: Project -> Properties -> Run/Debug Settings: 1. select "Launching New_configuration ...
- Java 读取指定目录下的文件名和目录名
需求:读取指定目录下的文件名和目录名 实现如下: package com.test.common.util; import java.io.File; public class ReadFile { ...
- MVC如何在单独的类库中添加区域
今天要做一个将区域放到单独的类库中的程序,其实就是多加几个引用的问题,但是我比较喜欢这种设计结构,因为这样的话可以把单独的应用逻辑放在单独的类库中处理,项目看起来更清晰分明,所以写了这个随笔. 首先创 ...
- 比较全面的MySQL优化参考(上下篇)
转自:http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨 ...
- JDK中的并发bug?
最近研究Java并发,无意中在JDK8的System.console()方法的源码中翻到了下面的一段代码: private static volatile Console cons = null; / ...
- 记一次查内存异常问题(续《记一次Web应用CPU偏高》)
继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...
- android linker (1) —— __linker_init()
ilocker:关注 Android 安全(新手) QQ: 2597294287 __linker_init() 在 begin.S 中被调用,并传入两个参数:sp(堆栈指针).#0. linker( ...
- Java + eclipse + awt 编写锻炼打字小软件(未完成)
进入前界面: import java.awt.*; public class Welcome extends JFrame implements Runnable{ Thread t; private ...
- oracle 11g dataguard创建的简单方法
oracle 10g可以通过基于备份的rman DUPLICATE实现dataguard,通过步骤需要对数据库进行备份,并在standby侧进行数据库的恢复.而到了11g,oracle推出了Dupli ...
- OO的设计原则
今天同事和我们一起讨论分享了OO的设计原则,讨论使人明晰,有人一起讨论学习是一件幸福的事情. 1.开闭原则 对功能的扩展是开放的,对修改是闭合的. 可以应用于类的设计,框架的设计等. 为什么?开闭原则 ...