[iOS] 输入框高度随输入内容变化
一般,类似聊天软件的输入框默认都是显示一行的,在用户输入过程中根据输入文字的内容来改变输入框的高度,以便显示全部文字。像微信,QQ的输入框就是这样的。那么这个效果应该怎么实现呢?
实现这个效果的关键点只有两点:
- 获取正在输入内容在
UITextView占用了多少行 - 让
UITextView动态改变大小
一开始,为了解决第一个问题,我一直在考虑怎么获取换行事件,发现只用捕捉
\n输入即可,但这样又有一个麻烦,就是删除行怎么办?所以感觉这个思路太麻烦
对于第一点,有一个方便的计算方法,就是获取UITextView内容的高度比上UITextView的字体的高度,即可得到当前的行数。
这里有一个技巧,那就是不要用UITextView的bound.size.height获取其高度,因为这个获取的高度跟你输入的文字总高度并没有任何关系。
要知道,UITextView是继承UIScrollView的。
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITextView : UIScrollView <UITextInput>
这一点你可以不知道,但根据平时的操作经验,一个UITextView输入文字过多时是可以用手上下拖动浏览内容的,所以可以猜想是和UIScrollView有关系。
另一个类似的输入框
UITextField不支持换行哦,设置什么lineBreakMode啊,lineNumber(好像没这个属性)啊都不可以换行!我以前在这上面栽过跟头。UITextField输入满了会把文字顶到前面看不见的地方,但还不支持左右拖动!这一点比Android体验要差!
好了,知道其集成UIScrollView就好办了,因为UITextView只有在输入内容超过其显示范围才可以拖动,那就知道输入文字的bound就是UIScrollView的contentSize。这样就知道输入内容的总大小了。
那每一行的高度呢?
按我以前的经验,行高差不多是字体大小的 4/3 倍.这样设值显示效果一般都挺好。所以可以设值一个宏定义来处理与字体相关的高度。
当然,我的经验是因为过去没有这方面经验的笨办法,正确的办法是使用Font的lineHeight属性:
// The height of text lines (measured in points). (read-only)
@property(nonatomic,readonly) CGFloat lineHeight NS_AVAILABLE_IOS(4_0);
OK,知道每行的高度,就可以计算当前有多少行文字了,在
- (void)textViewDidChange:(UITextView *)textView
代理方法中计算高度即可。
对于第二点,根据计算出的高度重绘界面布局即可。这里我用的是自动布局,每次高度改变就刷新布局关系就行。下面放部分代码:
我把输入框和一些其他组件封装为一个控件,在类中声明代理:
@protocol EssayEditDelegate <NSObject>
@optional
- (void) onTextViewLineCountChangeTo:(NSInteger)lines;
@end
在每次输入内容的时候计算行数,声明一个变量保存上一次的行数,两次行数不一致即为发生换行
(void)textViewDidChange:(UITextView *)textView {
NSInteger numLines = textView.contentSize.height / textView.font.lineHeight;
if (numLines != rows) {
rows = numLines;
//发生换行
if (_delegate && [_delegate respondsToSelector:@selector(onTextViewLineCountChangeTo:)]) {
[_delegate onTextViewLineCountChangeTo:rows];
}
}
......
}
在外部实现代理方法,更新界面
#pragma mark - Essay delegate
- (void)onTextViewLineCountChangeTo:(NSInteger)lines {
rowCount = lines;
[self remakeConstraint];
}
- (void)remakeConstraint {
NSInteger toobarHeight;
NSInteger rows = rowCount > DEFAULT_ROW_COUNT ? rowCount : DEFAULT_ROW_COUNT;
toobarHeight = (ESSAY_EDIT_FONT_SIZE / 2 * 3) * rows + MARGIN_BUTTON * 2;
[toolBarView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.right.equalTo(self);
make.top.equalTo(quesImageView.mas_bottom);
make.height.mas_equalTo(toobarHeight);
}];
}
[iOS] 输入框高度随输入内容变化的更多相关文章
- html中用div代替textarea实现输入框高度随输入内容变化
项目中的需求:留言栏输入高度变化,超过1行时,自动伸展,超过4行后,不再伸展.主要思想是利用最小高度和最大高度,再加上overflow来实现,到了最大高度,文字不会溢出而是隐藏.根据文本框中字体的大小 ...
- textarea高度随文本内容变化,且不出现滚动条
通常文本域的写法如下 <textarea type="text" class="form-control pull-left" id="desc ...
- td高度不随内容变化display:block;display:block;display:block;display:block;display:block;
在TD里加个DIV就可以解决!CSS对应改成#aaa td div{ height:236px; overflow:hidden; 在TD里加个DIV就可以解决!CSS对应改成#aaa td div{ ...
- 输入框input内容变化与onpropertychange事件的兼容
一.输入框常用的几个事件 onblur 元素失去焦点. onchange 域的内容被改变. onclick 当用户点击某个对象时调用的事件句柄. ondblclick 当用户双击某个对象时调用的事件句 ...
- iOS(Swift) TextField限制输入文本的长度(不是字数)
最近做项目有一个特殊需求,就是需要限制一个TextField的输入文本的长度在一定范围内(注意,不是字数),上网查了一圈没有找到类似文章,这里把我的方法写进来,mark一下: 1.对TextField ...
- iOS UITextView 输入内容实时更新cell的高度
iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog 11 4741 UIT ...
- html5 textarea 文本框根据输入内容自适应高度
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- TextWatcher-监听输入框内容变化
今天在做邮件登录的时候,遇到了输入框(Edittext)监听事件(TextWatcher),现在记录下. 首先看如下代码 eText.addTextChangedListener(new TextWa ...
- input输入框内容变化实时监听
js实现的文本框内容发生改变立马触发事件简单介绍:本章节介绍一下如何在文本框的内容发生变化的时候,立马触发一个事件执行响应的操作,而不是像是keydown或者keyup事件一样,只能够检测通过键盘输入 ...
随机推荐
- .NET Framework 源码查看与调试
1. 直接下载.NET Framework源代码(下载地址),然后用Visual Studio 13 打开查看.2. 在线查看,网址:http://referencesource.microsoft. ...
- Linux 各种运算符
目录 - 算术运算符 - 关系运算符 - 逻辑运算符 - 按位运算符 - 文件测试符 - 算术运算符 算术运算符,常用的有+.-.*./.%.++.--.** + - 加法运算符 [root@www ...
- filebeat-2-通过kafka队列链接logstash
filebeat 直接到logstash, 由于logstash的设计问题, 可能会出现阻塞问题, 因为中间使用消息队列分开 可以使用redis, 或者kafka, 这儿使用的是kafka 1, 安装 ...
- mysql添加用户、修改权限,修改登录权限ip
1.添加用户 1.1 登录MYSQL: @>mysql -u root -p @>密码 1.2 创建用户: 格式:grant select on 数据库.* to 用户名@登录主机 ide ...
- php和mysql学习问题笔记
1.Undefined index: pwd in E:\xampp\htdocs\phpbase2elite\12\source\register.php on line 6 这是一个警告,表示数组 ...
- 网络之NSURLSession
NSUrlSession参考的这篇博客,自己也调试了它的代码:http://www.it165.net/pro/html/201406/15223.html ,对NSUrlSession还不太理解,先 ...
- 学习MVC和jQuery相关的书
Insus.NET还是较喜欢看纸质书.学习ASP.NET MVC和jQuery编程,Insus.NET为了加强功力,决定再购买几本相关的书: 十月份时,还买了一本: 前两本快递刚送到手,后一本已经 ...
- Jquery停止动画
stop方法 第一个参数:是否清除动画队列 true | false 第二个参数:是否跳转到动画最终效果 true | false 使用stop()方法的技巧 当下拉菜单和手风琴产生动画队列的问题 ...
- 设计模式之工厂方法(FactoryMethod)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...
- 无法将类型“System.Collections.Generic.List<anonymous type:string ClassID,string ClsssName>”隐式转换为“System.Collections.Generic.List<Ecology.Model.EnergyFlowGraph>”
无法将类型“System.Collections.Generic.List<anonymous type:string ClassID,string ClsssName>”隐式转换为“Sy ...