我做这个效果做了一天,你可能不是很相信,我在搜索引擎上找到的方法都是错误的;直到我在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找你要的效果吧,文章写出来也是为了减少你们的开发时间,不要纠结一些未知的东西,不值得!
网友评论
还有placeholderView既然也只能显示一行,为什么不用label代替?
那你想滚动到第一行怎么办?