LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:【UITextView的高度随着内容高度的变化而变化】。实现思路应该是:

在UITextView的textChanged事件响应代码里计算输入内容的高度,然后如果高度与文本变化前比起来有变化,则修改UITextView的高度为这个新的高度。

这看起来很简单。

添加内容变化的通知响应事件:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name: UITextViewTextDidChangeNotification object:nil];

计算内容高度有两种方式:

  1. 计算输入文字在指定字体、指定容器和指定换行方式下的size.

CGSize newSize = [textView.text

sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14]

constrainedToSize:CGSizeMake(222,9999)

lineBreakMode:UILineBreakModeWordWrap];

2.  textView继承自UIScrollView,直接从contentSize属性获取

textView.contentSize.height

第一种方式拿出来的高度需要再加上padding的值才是最终的值(即每行的空白区域),并且需要指定constrainedToSize,不太灵活。第二种方法简单直接准确,我选择了它。

在IOS 5.0及以上,以上实现已经足够完美了。在IOS4.3中发现了bug,当文本框变成多行,然后清空文本框再输入文字时,发现内容和光标跑到了UITextView上方并且不可见。Google关键字"one line uitextview"可以发现类似的bug提问。经过查证资料和跟踪代码,根本原因应该UITextView的Insets.bottom在文本输入的过程中被不断地自动设置造成的。这是UITextView的默认实现行为,但这肯定是IOS4.3的bug,而IOS5.0修复了它。解决办法就是试图阻止UITextView设置contentInset,我们可以继承UITextView并且覆盖setContentInset:方法来达到目的,在setContentInset:里只需要设置一个固定的contentInset.bottom即可。

还有一个地方需要注意,当你清空输入框时(_textView.text=@"";),不会自动触发textChanged:,你需要重写setText:方法来调用textChanged:。并且你清空textview后,你拿到的contentsize也不准确,所以还需要根据text是否为空来设定一个最小的高度。

在iOS 7以前,如果要实现UITextView自适应高度的话,可通过取contentSize.height的方法来设置。但在iOS 7上这种方法是无效的,下面是一种简单的处理方法:

- (CGSize)contentSizeOfTextView:(UITextView *)textView

{

    CGSize textViewSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, FLT_MAX)];





    return textViewSize;

}

最新文章

  1. CSS3--box-shadow
  2. 一种模拟position: sticky;的方法
  3. RAID一个硬盘FAIL。
  4. 在apache连接多php的时候遇到了问题,怎么切换多个php版本?
  5. PHP使用mail()函数发送邮件流程以及注意事项
  6. Yii中使用PHPExcel导出Excel
  7. Java 序列化的高级认识
  8. 用for循环遍历DataTable中的数据
  9. 深入浅出数据结构C语言版(10)——树的简介
  10. app请求服务器数据方法1-HttpUrlConnection
  11. qt5.11.2+vs2017环境下opencv3.4.1编译配置
  12. hadoop.docker.up.problems: Too many levels of symbolic links
  13. 卷积神经网络 CNN
  14. Spring Core Programming(Spring核心编程) - AOP Concepts(AOP基本概念)
  15. bash编程-正则表达式
  16. THE First Individual Project - Word frequency program
  17. gitlab查看项目ID/projectId
  18. <xsd:import>
  19. Zabbix 监控端口状态并邮件报警
  20. 使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration

热门文章

  1. 创建文本节点createTextNode
  2. 如何解决Reporting Services目录数据库文件存在的问题
  3. java 多态 ---父类调用子类方法
  4. cdlinux可以安装在c盘
  5. jQuery中的ajax的相关方法
  6. 用jquery实现日期控件
  7. python爬微信公众号前10篇历史文章(6)-话说http cookies
  8. 初尝Eclipse
  9. java报错排解
  10. Redis学习笔记01--主从数据库配置