Des's iOS iOSer 的自我修养iOS

UITextView高度随内容自增长,只有这样才是对的

2016-11-11  本文已影响1686人  Thebloodelves

我做这个效果做了一天,你可能不是很相信,我在搜索引擎上找到的方法都是错误的;直到我在github搜索到了这个源码

https://github.com/iThinkerYZ/YZInputView 

发现原来还差这一步;如果你是直接要结果的人那么这篇文章已经结束了,如果你是一个喜欢探索的人,那么请看我分析一下我一步一步走过的坑;首先放一张完成图:


最终效果.gif

第一次实现

你们不用跟着敲,看我的代码就行了;首先我会想着是加通知,在回调里面计算高度,这个我们都知道的:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:_textView];

然后给UITextView高度拖一个约束出来动态改变:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeight;

最后在回调中我们计算字符串应该占用的高度再改变约束,就像这样:

NSString * currStr = _textView.text;
CGFloat height = [currStr boundingRectWithSize:size options:option attributes:attributes context:nil].height;
_textViewHeight.constant = height;

那么这样是错误的,因为做出来的效果是输入内容第一行都显示不完,就像这样:


第一次效果图.gif

这明显不是我们要的东西,第一行还在抖动,第二行还显示不完,还可以滚动,大错特错

第二次实现

然后大概去搜索了一下,说的是UITextView存在一个和h5盒子模型中的padding类似的东西,也就是frame是由padding和contentSize共同决定的,所以我们加上这句话去掉padding:

_textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0);

第二次运行的效果大概是这样的:


第二次效果.gif

这次稍微好一点了,不会抖动和滚动了;但是第二行输入的数据内容没显示完,但是高度显示完了的,这当然也不是我们要的效果

第三次实现

这次我是真的有点懵逼了,我暂时想不到是什么原因,于是在网上搜到可以用UITextView的contentSize.heignt来设置高度,因为内容高度总对的吧,于是我们在UITextViewTextDidChangeNotification回调中这样改:

self.textViewHeight.constant = _textView.contentSize.height;

然后这次运行的效果是这样的:


第三次效果.gif

依然,这不是我们要的效果,显示不全

第四次实现

那么我们错在哪里呢?我这时候是真的不知道什么原因了,因为我已经试了网上能搜出来的各种方法,这时候我想起了男性交友社区github,然后去上面看了看;然后看到了文章开头的给出的地址,我去用了一下:满分!里面有这么两个重点,1:计算文本占用的范围用这个最好:

- (CGSize)sizeThatFits:(CGSize)size;

2:造成显示不完的原因是因为这句话:

_textView.scrollEnabled = NO;//这句话是重点,不然有奇怪的现象

所以一句话,先在github找你要的效果吧,文章写出来也是为了减少你们的开发时间,不要纠结一些未知的东西,不值得!

上一篇下一篇

猜你喜欢

热点阅读