美文网首页Des's iOS iOSer 的自我修养iOS
UITextView高度随内容自增长,只有这样才是对的

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

作者: Thebloodelves | 来源:发表于2016-11-11 09:50 被阅读1686次

    我做这个效果做了一天,你可能不是很相信,我在搜索引擎上找到的方法都是错误的;直到我在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找你要的效果吧,文章写出来也是为了减少你们的开发时间,不要纠结一些未知的东西,不值得!

    相关文章

      网友评论

      • 清無:self.scrollEnabled = height > _maxTextH && _maxTextH > 0;
        还有placeholderView既然也只能显示一行,为什么不用label代替?
        清無:@Thebloodelves 对,我用label做的
        Thebloodelves:@Thebloodelves 哦,你问的是地址中的demo为什么不用label来做占位是吧?其实这个都是经验问题了,用label有些时候会出错
        Thebloodelves:@菲拉兔 饿,我没有写完整,不过在开头的github里面很详细了,去看看吧 :smile:
      • 五蕴盛:男性交友社区github :joy:
        清無:@五蕴盛 还有pornhub
      • 清無:_textView.scrollEnabled = NO;
        那你想滚动到第一行怎么办?
        Thebloodelves:@菲拉兔 看看开头的github地址,超过最大行设置成yes
      • 我是Python小白:楼主 有没有 女性交友社区呀?
        Thebloodelves:@iOS_Reverse 有啊,我群里有11个妹子呢,你是妹子吗?
      • 春泥Fu:学习了…
      • 骑毛驴的小强:很nice
        Thebloodelves:@小王想飞天 谢谢
      • Lol刀妹:很给力
        Thebloodelves:@无夜之星辰 谢谢

      本文标题:UITextView高度随内容自增长,只有这样才是对的

      本文链接:https://www.haomeiwen.com/subject/whxfpttx.html