iOS中UITextView的操作技巧
刚才看了一篇textView实现placeholder的文章,有兴趣的同学们能够看下: __biz=MzA3NzM0NzkxMQ==&mid=211846438&idx=1&sn=880729050e97edc1272f2ae8a83192db&scene=0&key=0acd51d81cb052bcd1e2b5485c3e0fbc3c1f1badefcf2f9b68e80a3b771cb841289189835fd114e958aa8d786e0e3b68&ascene=0&uin=MTkwMTE1NjM1&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.4+build(14E46)&version=11020113&pass_ticket=T3%2F5M5hSz51wVAN4AXZ9ysEoO0rn9t3uNwpULKKo5Pc%3D">点击打开链接
近期工作做了一个项目,有很多地方都须要显示文本,而且须要动态计算文本高度.使用过UILabel,UITextField,UITextView,而各有各的缺点....
之前使用无框textfield的时候不能设置文本垂直方向的位置,后来想想仅仅要先计算好文本高度再设置textfield高度事实上就能够了.
当时没有想开,于是使用了UITextView,可是吧,这个东西- -跟textfield相比代理函数较少,出现了各种各样蛋疼的问题,当中不不过textView的问题,让我一一道来.
1.我想在键盘栏上面自己定义一行控件,怎么做?
textView以及textField有个属性是accessoryView,设置一个你想设置的view
[[self textView] setInputAccessoryView:floatView];
这样便可解决该问题.
2.由于不同尺寸iPhone以及不同输入法的设备键盘高度不同,怎样得到键盘高度?
须要在ViewWillAppear:中增加对键盘弹出以及收回事件的监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHidden:) name:UIKeyboardDidHideNotification object:nil];
在Notification的參数中有个属性UIKeyboardFrameBeginUserInfoKey ,于是便可获得键盘高度.
# pragma mark - 键盘监听事件(隐藏/显示placeholder,设置textViewNull)
- (void)keyboardShown:(NSNotification *)notification {
[self setConstraintHeight:(<span style="color:#ff6666;">[[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey]</span> CGRectValue].size.height)];
[[self bottomConstrain] setConstant:([self constraintHeight])];
}
3.检測输入的文字除标点符号以外字符的长度
一開始想用把NSString转成UTF-8格式,然后使用Char *取每个字符推断asc码,结果app crash证明了这种方法的不可行.
原因是:一个char *能够存一个英文字符,而中文字符须要两个char *,而且emoji表情也是两个char *,单取一个会导致crash.
想用正則表達式,可是同一时候还须要推断中文符号和英文符号,本来正則表達式用的就不太熟练,于是放弃了这个念头,
最终找到一个解决方法.NSString 有个方法componentsSeparatedByCharactersInset:
而NSCharacterSet这个集合正好能够设置为符号集.问题得以解决,截取字符串再拼接检測长度就能够了.
- (BOOL)checkString:(NSString *)value {
NSMutableCharacterSet *separateSet = [NSMutableCharacterSet whitespaceAndNewlineCharacterSet];
[separateSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
NSArray *words = [value componentsSeparatedByCharactersInSet:separateSet];
NSString *str = [NSString new];
for (NSString *x in words) {
str = [str stringByAppendingString:x];
}
if ([str length] > 4) {
return YES;
}
return NO;
}
4.textView光标切换
这个页面的textView是一个回复页面,也就是说有的时候我须要在用户进入该页面的时候生成模板文字,然后让用户点击textView时候从模板中间空缺的地方開始编写
- (void)textViewDidChangeSelection:(UITextView *)textView {
if ([[[self textView] text] isEqualToString:[[self fixedAnswer] objectAtIndex:[self currentStyle]]]) {
NSRange range = NSMakeRange(4, 0);
textView.selectedRange = range;
}
}
这里[self fixedAnswer]是我设置好的模板数组,在推断用户假设是在没有输入文字情况下点击的textView,那么就在textView中的第4个字符后插入光标.
5.没有placeHolder?
...
正是看到了开篇的那篇文章让我想起来了要整理一下在做textView遇到的这些问题,textView是没有placeHolder的,那我们就须要自己设置placeHolder.
我的做法不是文章中讲的那种,我是在textview開始编辑的位置设置一个UILabel,样式尽量做成placeHolder的样子,然后在textView代理函数
textViewShouldBeginEditing:中将placeHolder隐藏.
在textViewShouldEndEditing:中推断textView是否有文字来决定是否显示placeHolder;
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
[[self placeHolderLabel] setHidden:YES];
return YES;
}
- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
if (![[[self textView] text] length]) {
[[self placeHolderLabel] setHidden:NO];
}
return YES;
}
6.怎样用户检測textview弹出的键盘上的确定键?
假设是在textField 中那么想这么做就简单多了,实现代理函数textFieldShouldReturn:,想干嘛干嘛就好啦.
可是...textView并非textField.
只是也有解决方式.
textView 也有个代理函数shouldChangeTextInRange: replacementText:
在这里仅仅要推断replacementText的值是\n,那么就确定用户点击了右下角的确定键.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if ([text isEqualToString:@"\n"]) {
//
}
return YES;
}
难得清闲了几晚,近期遇到的textView的问题今天就写到这里了,有空的话会陆续写出遇到的其它问题.
谢谢大家,再见咯~
iOS中UITextView的操作技巧的更多相关文章
- 关于ios中的文本操作-简介
来源:About Text Handling in iOS 官方文档 iOS平台为我们提供了许多在app中展示文本和让用户编辑文本的方式.同时,它也允许你在app视图中展示格式化的文本和网页内容.你可 ...
- iOS 中SQLite数据库操作
在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 ...
- QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData
SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...
- iOS中UITextView键盘回收
iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...
- iOS中 UITextView文本视图 技术分享
UITextView: 文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文. UITextField的用处多,UITextView的用法也不 ...
- 关于iOS中的文本操作-管理text fields 和 text views
Managing Text Fields and Text Views 管理UITextField和UITextView实例 UITextField和UITextView的实例拥有两个最主要的功能:展 ...
- IOS中UITextView(多行文本框)控件的简单用法
1.创建并初始化 UITextView文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文.UITextField的用处多,UITextVie ...
- iOS中的加密操作
最近项目中用到了一些加密操作,在这里简单总结了一下.总的来说加密分为对称加密和非对称加密两种,下面对这两种加密方式作一个简单的说明. 对称加密(Symmetric Cryptography) 对称加密 ...
- OC中文件的操作
OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了哪些可以操作文 ...
随机推荐
- CSS元素超出部分滚动,并隐藏滚动条
方法一, 利用 css 3 的新特性 -webkit-scrollbar, 但是这种方式不兼容 火狐 和 IE <!DOCTYPE html> <html> <head ...
- Nginx 配置https请求
通过阿里云生成指定的https证书文件xxxx.key 和 xxxx.pem文件 在阿里云上申请的https证书的是pem格式,转成cer 先在终端cd到文件目录下 然后 openssl x509 - ...
- Kafka的3节点集群详细启动步骤(Zookeeper是外装)
首先,声明,kafka集群是搭建在hadoop1.hadoop2和hadoop3机器上. kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 如下分 ...
- Unity学习-摄像机的使用(六)
快速对齐摄像机 [选择摄像机-GameObject-Align With View] Game模板中显示的界面,就是摄像机拍摄后的画面 本次学习案例 添加一个地形,一个点光源,三个Cube 了解摄 ...
- UIPickerView的应用
UIPickerView 是一个选择器控件, 它可以生成单列的选择器,也可生成多列的选择器.UIPickerView 直接继承了 UIView ,没有继承 UIControl ,因此,它不能像 UIC ...
- 图解TCP/IP笔记(3)——IP协议
目录 IP协议 IP寻址 IP地址组成 IP地址分类 广播地址 子网掩码 全局地址和私有地址 IP协议 跨越不同数据链路,实现两端节点之间的数据包传输 数据链路:只负责某一个区间之间的通信传输 IP协 ...
- BFS小结
其实bfs本身不难,甚至不需要去学习,只要知道它的特性就可以写出来了.往往,bfs都是用递归做的.递归比循环更容易timeout.所以这次遇到一题bfs,卡时间的就悲剧了. PAT1076 #incl ...
- SpringBoot 搭建
1.使用Eclipse 建立Maven项目(webapp OR quickstart) 2.配置Maven,如下: <parent> <groupId>org.springfr ...
- strut2 拦截器 使用
拦截器是strut2里一个很振奋人心的应用.通过配置拦截器可以在action执行之前进行一些初始化或者是其他的操作,但是在action执行之后,返回结果就已经确定,结果是很难改变了(目前我还不知道怎么 ...
- 多线程-实现Runnable接口
当一个任务或者函数多个线程同时调用时仅仅继承Thread是不行的.需要实现Runnable接口. 好处: 1.将线程的任务从线程的子类中分离出来,进行了单独的封装. 按照面向对象的思想将任务封装成对象 ...