UITextView使用中的那些坑

UITextView使用中的那些坑

本文主要是介绍在使用UITextView的时候遇到的问题, 这也主要是源于前几天项目需要使用UITextView进行文本展示, 首先来说说UITextView的几点好处吧.

1.在面对多行文本展示的时候, 相比UILabel更加灵活, 特别需要动态输入的时候, 高度动态变化的时候, UITextView相比UITextField而言, 使用更加方便, 代理方法也更加丰富, 一般遇到这种情况, 推荐大家使用UITextView.

2.针对文本样式改变的时候, 比如链接, 下划线, 着色等类似的场景的时候, 可能更加便利.

UITextView的使用场景大致介绍一下, 但是我们在使用UITextView的时候也会遇到很多坑爹的地方. 这里就介绍一个比较常见的问题.

UITextView设置文本后无法滚动到顶部

这里主要介绍的是, 由于UITextView高度限制, 可能无法显示全部的文本, 这时候UITextView是可以滚动的, 因为实际上它就是UIScrollView, 那么问题就出现在这里?

我们希望设置完文本之后, UITextView滚动到顶部, 然后可以滑动显示, 这里很自然我们会想到这样解决:


或者


其实二者的解决原理是差不多的, 但是结果如何捏? 答案是无效!!!!
我们看到的效果还是滚动到了底部, 那么这到底是为什么捏?

这里可能跟UITextView本身的机制有关, 具体的本人也没有仔细去研究, 其实我们可以跟踪UITextView的contentOffset发现一些问题:

这里我们采用KVO的方式去查看contentOffset的变化过程,

这里我们检测contentOffset的变化:



从log出来的结果可以发现:


其实UITextView的contentOffset的变化经历了阶段, 至于每个阶段具体的事情, 本人也不是很清楚, 但是有一点可以确定的是, 我们之所以设置contentOffset没有效果, 是因为在我们设置的时候UITextView本身的contentOffset依然是0, 那么什么时候有效果捏?

当然是在contentOffset不为0的时候, 也就是UITextView已经滚动到底部的时候, 这个时候设置才是有效的, 至于具体的原因, 我们可以通过解决方法去探究:

一下是我在stack overflow上找到的解决方法:


这里作者采用了多线程的方式去设定contentOffset, 我们可以猜想可能UITextView的渲染方式是异步的, 这个也很容易理解, 如果UITextView文本内容特别长, 其实渲染是需要花费一定时间的, 异步的方式也不会阻塞主线程, 但是这就给我们带来了一定的麻烦, 因为我们不知道UITextView什么时候渲染完成, 然后去改变它的contentOffset来达到我们想要的效果.

总结

其实从之前的分析中, 我们也可以渐渐发现, 其实一旦UITextView渲染完成, 它的contentOffset不为0, 这个其实可以作为我们判断的标准.

至于解决方法, 以上是一种实现方式, 个人感觉不是很靠谱, 但是使用起来也没什么问题, 觉得不靠谱的原因是因为: 以上是在主队列中加入操作去执行, 可能之前UITextView的渲染也是主队列中的操作, 因为是串行的, 所以有执行顺序, 也没出现什么问题.

但是个人觉得我们解决问题的根本是contentOffset改变的问题, 我们应该在contentOffset不为CGPointZero的时候, 去修改一次contentOffset, 让它滚动到顶部, 下面提供两种解决思路:

1.采用KVO的方式, 去检测contentOffset的变化, 在发现其值不为0之后, 让其滚动到顶部(这个过程只能初始化执行一次, 不然以后滚动的时候contentOffset也会变化)

2.采用定时询问的方式, 可以采用定时器去间隔查询contentOffset的值, 如果一旦发现其值不为0了, 就可以让其滚动到顶部, 然后关闭定时器, 也是初始化的时候执行一次.

以上两种方式本人都测试过, 希望对大家有帮助, 另外希望苹果官方能够解决这个问题, 个人感觉像是UITextView的bug, 因为毕竟iOS不开源,我们无法查看具体的实现流程, 只能根据自己的推断去查找解决方法, 希望官方能够给出完美的解决方法.
https://blog.csdn.net/wlaizff/article/details/51585880

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,009评论 3 119
  • 因为公司的需要,我们需要做一个Cocos2dx 和 Mac原生混合的一个应用出来,但是期间出现了一些问题,因为我们...
    佛祖拿屠刀阅读 901评论 0 1
  • 小时候,觉得父亲就是超人。 任何坏掉的电器在他的敲敲打打之后,都会乖乖地开始工作;还拥有跟哆啦A梦一样的魔法口袋,...
    杜小美阅读 248评论 1 4
  • 1.Long类型的空比较,不是null,而是0L 错误的写法 正确的写法 2.equals 与 == 的使用问题 ...
    JackEason阅读 440评论 1 0
  • 昨天晚上到现在想想就觉得内疚,最近半年对美美太凶了,哪里有妈妈的样子,简直就是巫婆,我不能再让自己后悔了!在美美最...
    巫山乌云阅读 146评论 0 0