iOS自定义视图- SJTextView
需求:
- textView 需要placeholder用来提示输入
- textView 要做字数限制
- textView 禁止表情符号的输入
思考:
因为需求比较通用,便想通过自定义SJTextView来实现:
- placeholder 通过在textView上添加一个透明的label,输入开始后隐藏实现。
- 字数限制可以在代理方法中实现,字数达到最大后禁止输入
- 表情符号禁止输入(这个不常用,因为我们服务器不接收,于是做了限制输入),用了github中 SearchEmojiOnString-iOS 关于表情的 NSString+EMOEmoji 可以很方便实现
问题:如果在自定义SJTextView时使用了UITextView的代理方法,如果在使用这个自定义的TextView中再使用代理方法,就会覆盖SJTextView中的代理方法。
解决:UITextVeiw 给了三种编辑状态 UITextViewTextDidBeginEditingNotification UITextViewTextDidChangeNotification UITextViewTextDidEndEditingNotification 可以通过监听 UITextViewTextDidChangeNotification 来对textView进行处理。
实现:
添加外部属性
/**
占位字符串
*/
@property (nonatomic, strong) NSString *placeholder;
/**
占位字符串颜色
*/
@property (nonatomic, strong) UIColor *placeholderColor;
/**
字符串长度限制
*/
@property (nonatomic, assign) NSUInteger limitedLength;
/**
是否机制字表情符号的输入
*/
@property (nonatomic, assign) BOOL emojiDisable;
添加方法
1. 添加占位字符label
/**
占位字符串
@param placeholder 占位字符串
*/
- (void)setPlaceholder:(NSString *)placeholder {
if (placeholder) {
_placeholder = placeholder;
self.placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 8, self.frame.size.width - 10, 0)];
self.placeholderLabel.numberOfLines = 0;
self.placeholderLabel.text = placeholder;
self.placeholderLabel.textColor = [UIColor lightGrayColor];
self.placeholderLabel.font = [UIFont systemFontOfSize:13]; // UITextView 默认的字体大小为13
[self adjustLabelFrameHeight:self.placeholderLabel]; // placeholder适应高度
[self addSubview:self.placeholderLabel];
}
}
2. 限制表情符号输入
/**
限制表情符号的输入 需要引入 NSString+EMOEmoji 分类,也可以把方法复制过来
*/
- (void)disableEmoji {
if([self.text emo_containsEmoji]) {
// emo_disableEmoji 方法是,在 NSString+EMOEmoji中改写了一个方法,具体看代码
[self setText:[self.text emo_disableEmoji]];
}
}
3. 添加字符长度限制
// 给SJTextView添加一个属性 记录上一次最后显示在textView中的字符串的内部属性, 是完成字符串长度限制的关键
// 最后一次显示在textView中的符合限制字符串
@property (nonatomic, strong) NSString *lastText;
// 初始化时,添加监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewEditChanged) name:UITextViewTextDidChangeNotification object:self];
// 监听方法实现
- (void)textViewEditChanged {
// ----- placeholderLabel 的显示与隐藏 -----
if (self.text.length == 0) {
[self.placeholderLabel setHidden:NO];
}
else {
[self.placeholderLabel setHidden:YES];
}
// ----- 禁止输入表情符号 -----
if (self.emojiDisable) {
[self disableEmoji];
}
// ----- 字数限制 -----
// 获取高亮部分
UITextRange *selectedRange = [self markedTextRange];
UITextPosition *pos = [self positionFromPosition:selectedRange.start offset:0];
// 如果输入的字还可以变化,就不做限制,self.lastText也不会记录还在变化状态的文字
if (selectedRange && pos) {
return;
}
if (self.text.length > self.lastText.length) {
NSString *newInputText = [self.text substringFromIndex:self.lastText.length];
NSUInteger canInputLength = self.limitedLength - self.lastText.length;
// 如果长度超出了可输入长度,还原为上次输入的字符串,也就是说如果你是复制的一大段文字,长度超过了可输入的长度,这段文字一个字都不会输入到TextView中(你要重新编辑好了再重新粘贴,输入一部分,还是要删除的)
if (newInputText.length > canInputLength || canInputLength == 0) {
[self setText:self.lastText];
// 这里给出提示,输入超过了限制
NSLog(@"%@",[NSString stringWithFormat:@"字数不能超过%lu个。",(unsigned long)self.limitedLength]);
}
}
self.lastText = self.text;
}
iOS自定义视图- SJTextView的更多相关文章
- Xamarin iOS教程之自定义视图
Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图. [示例2-33]以下将实现一 ...
- iOS自定义组与组之间的距离以及视图
iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...
- iOS学习之自定义视图时,在屏幕发生旋转时触发重新布局方法
如果要对自定义的视图在屏幕旋转时重新布局,则在自定义视图中定义以下触发方法: -(void)layoutSubviews { [super layoutSubviews]; //1.获取到屏幕旋转的方 ...
- UI基础:UI程序执行顺序(UIApplicationMain()函数),自定义视图 分类: iOS学习-UI 2015-07-02 22:09 68人阅读 评论(0) 收藏
UI程序的一般执行顺序: 先进入main里面,执行函数UIApplicationMain(),通过该函数创建应用程序对象和指定其代理并实现监听,当执行函数UIApplicationMain()时还会做 ...
- 【iOS自定义键盘及键盘切换】详解
[iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...
- 自定义视图一:扩展现有的视图,添加新的XML属性
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! 简介 这个系列详细的介绍了如何穿件Android自定义视图.主要涉及的内容有如何绘制内容,layout和measure的原理,如何继承 ...
- iOS自定义的UISwitch按钮
UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...
- ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告
##DAY3 自定义视图.视图控制器.视图控制器指定视图.loadView. viewDidLoad.MVC.屏幕旋转.内存警告 #pragma mark ———————自定义视图的步骤 —————— ...
- UI 自定义视图 ,视图管理器
一>自定义label - textField 视图 自定义视图:系统标准UI之外,自己组合而出的新的视图 iOS 提供了很多UI组件 ,借助它们,我们可以做各种程序 尽管如此,实际开发中,我们还 ...
随机推荐
- Ubuntu和win10双系统Grup无法引导解决方案
通常我们经常安装双系统, 但是有时候安装完系统无法正常引导, 以下就说明Ubuntu和win10双系统, win10在grub界面不断循环的解决方案 直接在win10启动项目上按e进入编辑模式 在文档 ...
- 隐藏Nginx版本号的安全性与方法
搭建好nginx或者apache,为了安全起见我们都会隐藏他们的版本号,这边讲的是nginx的版本号,如果你也想隐藏apache的版本号,那请点前面的链接.请看nginx版本号信息隐藏文章. Ngin ...
- Arduino单片机使用和开发问题记录(转)
源:Arduino单片机使用和开发问题记录 1.将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00” 网上 ...
- Java将List/JavaBean转成Json
import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.List; /** * ...
- iPhone Info.plist属性说明
1.) <key>BadgeStyle</key> 设置这个属性就是修改通知标记 出现在未接电话短信邮件的那个小数字 可以改变字体 颜色 位置等 2.) <key> ...
- [转]六款常用的linux C/C++ IDE
之前在windows下开发习惯啦,linux改用vim开发代码,但是前期还是不熟悉看代码效率感觉有点低.由于看代码需要各种跳转查找我个人觉得还是IDE方便些,以前在windows下就挺喜欢使用code ...
- STM32 驱动1602液晶
利用STM32f103c8t6单片机驱动1602A液晶进行显示功能 上图即为写入信息后的效果图 本人用的是STM32的核心系统,无任何外设 库函数:3.5版本的库函数 驱动模式:采用4线驱动模式 供电 ...
- jquery $提示缺少对象$提示缺少对象
jquery $提示缺少对象 项目中存在不同版本的jquery,有1.4也有1.2, 之前运行项目不会报错 " $提示缺少对象 ",但是我的IE9重置之后就报错,从网上找了一大堆, ...
- http://begin.lydsy.com/JudgeOnline/problem.php?id=2774(poi病毒)
2774: Poi2000 病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5 Solved: 4[Submit][Status][Web Boa ...
- python中使用urllib2伪造HTTP报头的2个方法
在采集网页信息的时候,经常需要伪造报头来实现采集脚本的有效执行 下面,我们将使用urllib2的header部分伪造报头来实现采集信息 方法1. ? 1 2 3 4 5 6 7 8 9 10 11 1 ...