IOS UITextView自适应高度

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;
}

转载于:https://www.cnblogs.com/melons/p/5792021.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python获取mac窗口程序内容_在Mac OS X中获取当前活动窗口/文档的标题

在Objective-C,简单的答案,用少量可可和大多Carbon Accessibility API是:// Get the process ID of the frontmost application.NSRunningApplication* app [[NSWorkspace sharedWorkspace]frontmostApplication];pid_t pid [app processId…

php实战搭建博客,yii2项目实战-博客管理平台的搭建

作者:白狼 出处:http://www.manks.top/document/yii2-blog-manage.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。相信看了…

ACM学习历程—HDU2068 RPG的错排(组合数学)

Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R…

python训练手势分类器_机器学习零基础?手把手教你用TensorFlow搭建图像分类器|干货...

编者按:Pete Warden是TensorFlow移动团队的技术负责人。曾在Jetpac担任首次技术官。Jetpac的深度学习技术经过优化,可在移动和嵌入式设备上运行。该公司已于2014年被谷歌收购。Pete还曾在苹果公司从事GPU优化领域的图像处理工作,并为OReilly撰…

汉军Hundre考勤数据库数据表分析总结

ar-ATT为考勤刷卡数据库 Att-carRecord为刷卡流水,但是插入时需要根据workrecord表中数据进行判断 ATT-workrecord为运算后明细表存放位置,每次运算后重新生成。 刷卡数据更改方法: 查询序列:SELECT * FROM [AR_att].[dbo].[ATT_…

python内存消耗大吗_如何减少python内存的消耗?

标签:Python 打算删除大量涉及像C和C语言那样的复杂内存管理。当对象离开范围,就会被自动垃圾收集器回收。然而,对于由Python 开发的大型且长期运行的系统来说,内存管理是不容小觑的事情。在这篇博客中,我将会分享关于…

php invalid access,PHP出错消息PHP has encountered an Access Violation at XXXXXXXX 如何解决?...

1、是否zend所需的dll文件所在目录给的权限不够,必须有读取和运行的权限2、如果使用的是windows系统,是否设置过应用池,比如池https://anlijun.co中限制了什么

java class load 类加载

1:what is it jvm把描述类的数据从class字节码文件加载到内存,并对数据进行校验、解析、初始化,最终成为jvm直接使用的数据类型 1、ClassNotFoundExcetpion   我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常&#xf…

python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题。分享给大家供大家参考,具体如下:问题给定N个物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得放入背包的物品的总价值…

debian执行php网页,如何在Debian上安装和使用PHP Composer

php composer是一个包管理工具,它消除了手动维护应用程序的PHP包的麻烦,可以使用composer轻松安装所有必需的包。本篇文章将介绍在Debian系统上安装和配置PHP Composer的方法。1、条件shell使用sudo权限访问正在运行的debian系统。必须安装和配置5.3或更…

python图灵测试_最前沿:基于GAN和RL的思想来训练对话生成,通过图灵测试可期!...

PS:本文分析略深,需要一定的RL和GAN的基础。前两天,Stanford的NLP小组出了一篇神经网络对话生成的论文:标题就是使用对抗学习来做神经对话生成。这个idea非常的赞!在我看来是通往图灵测试的正确一步。以前的对话生成&a…

java map 实现 序列化,MapReduce序列化

序列化就是把内存中的对象转换成字节序列以便于存储到磁盘(持久化)和网络传输。反序列化就是将字节序列或者是持久化的数据转换成内存中的对象。内存中的对象只能本地进程使用,断掉后就消失了,也不能被发送到网络上的另一台机器,序列化可以将…

安装php时,make步骤报错make: *** [sapi/fpm/php-fpm] Error 1

安装PHP过程中,make步骤报错:(集中网络上各种解决方法) (1)-liconv -o sapi/fpm/php-fpm /usr/bin/ld: cannot find -liconv collect2: ld returned 1 exit status make: *** [sapi/fpm/php-fpm] Error 1 [rootlocalhost php-5.4.5]# 初步定位是iconv的问…

JAVA_if或者怎么用,Java If语句

Java教程 - Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statement;condition是一个布尔表达式。如果condition是true那么执行语句。如果condition是false,那么绕过语句。以下代码根据an的值输出消息…

iOS开发——高级技术本地化与国际化详解

本地化与国际化详解效果如下:英语: 中文: 具体实现如下:一。先做准备:设置程序本地化在xcode点击程序图标…

hog特征提取python代码_hog特征提取-python实现

【转载自 https://blog.csdn.net/ppp8300885/article/details/71078555】全部代码:importcv2importnumpy as npimportmathimportmatplotlib.pyplot as pltclassHog_descriptor():def __init__(self, img, cell_size16, bin_size8):self.imgimgself.img np.sqrt(img …

matlab 矢量化,matlab矢量化编程简要

一、基本技术1)MATLAB索引或引用(MATLAB Indexing or Referencing)在MATLAB中有三种基本方法可以选取一个矩阵的子阵。它们分别是下标法,线性法和逻辑法(subscripted, linear,andlogical)。1.1)下标法非常简单,看几个例子就好。A 6:12;A([3,5])ans 8 10…

Hadoop-HBASE案例分析-Hadoop学习笔记二

之前有幸在MOOC学院抽中小象学院hadoop体验课。 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例。 案例概况: 1)时间序列数据库(OpenTSDB) 用HBase储存时间序列数据,每时每刻都在解决&#xff…

python测试udp端口_怎样测试UDP端口

文章概述:怎样测试远程UDP端口,我们一般情况下,应用服务都使用的TCP端口,但是某些情况下,我们也需要开启UDP端口。本文简要描述怎样测试UDP端口是否正常?TCP端口大家都知道,比如80端口,可以使用…

Matlab经纬度坐标转换xy坐标,经纬度坐标系转换为UTM坐标系(matlab)

如题所说,直接上程序。验证自己做一下,结果应该是对的。诚不我欺。(注意:程序名与函数名保持一致!!!)function[shuchu]lat_lon2utm(lat_shuru,lon_shuru)%地理经纬度坐标转换为UTM坐标size_shuzusize(lat_s…