美文网首页iOS技术专题UIiOS之UITextView
UITextView输入时高度自适应&文本边距的设置

UITextView输入时高度自适应&文本边距的设置

作者: 横爬介士 | 来源:发表于2016-04-09 15:11 被阅读11831次

    UITextView是比较常用的长文本输入格式,圆角的设置和高度自适应常常是比较常用的需求,所以抽时间研究了一下UITextView。

    一.圆角的设置

    设置圆角UITextView类本身并没有提供这个方法或者是属性,所以我们可以通过layer层来设置其圆角。圆角的设置可能会设置两个问题

    1.离屏渲染

    设置圆角的时候使用maskToBounds会导致离屏渲染,目前先不使用maskToBounds,只单纯的设置圆角,离屏渲染涉及的东西比较多,后期单独发一篇,这里就先暂时不考虑。

    2.光标的位置

    设置圆角角度较少时,光标位置(光标位置并没有移动所造成的)影响并不怎么明显,当设置圆角角度较大时,真的丑爆了
    为了效果显著,圆角半径设置为20
    效果如图

    光标位置发生偏移
    系统其实提供了设置文本容器的边距的属性:textContainerInset;通过设置边距可以间接的改变光标的位置,边距依次为:上,左,下, 右。
    textView.textContainerInset = UIEdgeInsetsMake(20,20, 20, 20);
    改变以后的效果如图:(若感觉边距较大可以酌情修改至合适为止)
    光标为止修改后

    二.高度自适应

    这里使用的sizeThatFits方法,属于Auto Layout中的一个方法,深入了解Auto Layout 可以转到张不坏的博客-深入理解Auto Layout第一弹
    代码如下:

    -(void)textViewDidChange:(UITextView *)textView {
       //获得textView的初始尺寸
       CGFloat width = CGRectGetWidth(textView.frame);
       CGFloat height = CGRectGetHeight(textView.frame);
       CGSize newSize = [textView sizeThatFits:CGSizeMake(width,MAXFLOAT)];
       CGRect newFrame = textView.frame;
       newFrame.size = CGSizeMake(fmax(width, newSize.width), fmax(height, newSize.height));
       textView.frame= newFrame;
    }
    

    但是目前还有一个bug就是在文字换行的时候,文字整体会上移然后回落,体验特别差,因为textView继承于scrollView所以需要禁用滚动即将scrollEnable设置为NO即可。

    最终效果如图

    最终效果图.gif

    针对各位同行的问题,以及常见的需求,重写了demo并更新文章
    UITextView输入时高度自适应(优化增强版已经更新

    最后:iOS技术交流群

    群二维码

    相关文章

      网友评论

      • 记忆淡忘中:删除导致行数减1会自适应高度吗?
      • 健贱:作者可以的 写的东西 还挺好用 就是要注意下 block避免循环引用 在另一个文章上
      • 然也然也:自适应高度,怎么限定不超过某个高度呢?
      • 横爬介士:针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
        96ba08882163:@横爬介士 :+1:
      • RicoCL:为了解决跳动问题禁用了scrollEnabled,但一般的输入框输入到一定高度后高度是不变的,这时候又没法滑动查看前面或者后面的内容编辑了,这个该怎么解决呢 :joy:
        横爬介士:@RicoCL 针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
        RicoCL:@RicoCL 我的解决方法是,在
        - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
        这个方法里进行frame的更改,不过newSize的计算需要用进行手动计算了,记得在计算的时候去掉白边的距离。这样就不用禁用scrollEnabled 了
        :blush:
      • Stroman:你写得太好了。
        横爬介士:@Stroman 针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
        Stroman:@横爬介士 我对CGSize newSize = [textView sizeThatFits:CGSizeMake(width,MAXFLOAT)];中的sizeThatFits方法和MAXFLOAT参数并不是很理解,你能不能给我解释一下?
        如果可以的话,我们加QQ聊。
        1746483621
        横爬介士:@Stroman 欢迎各位朋友指正 :blush:
      • 来宝:小伙挺牛逼的:kissing_heart:
        横爬介士:@来宝 针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
      • 96ba08882163:删除文字的时候高度不会变化,你们也是吗?
        4c36bf2d187c:fmax(height, newSize.height) -------->newSize.height
        横爬介士:@DoubleY丶 针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
        横爬介士:@DoubleY丶 删除的时候高度不会变化?你创建textView的时候有个初始宽度,在这边设置一下,如果要是在删除的时候宽度要变小的话,可以在代理方法里面用if判断一下
      • 96ba08882163:如果我的文字是粘贴过来的没bug吗?
        横爬介士:@DoubleY丶 粘贴过来的?我想想哈,好像是没有bug,记不太清楚了,不好意思哈 ,你先试试,我看大家对这个demo的评论还挺多的,抽时间我重写一份
      • GJCode:为什么我设置内边距没有效果呢
        横爬介士:@GJCode 针对各位的问题,现在重写了一篇文章并且demo已经上传到github:http://www.jianshu.com/p/93e4578e7455
        GJCode:@横爬介士 ,搞定了,是我这边自己的问题。谢谢
        横爬介士:@GJCode 如果输入对的话应该是没有问题的,如果还是不出来的话,应该是受到其他代码的影响,你可以排查一下,抽时间我再重新写一份,然后上传到github
      • LaiYoung_:不管用,难道是我的姿势不对?求源码,15923456720@163.com
        横爬介士: @LaiYoung 成功了就好,我都准备重写写一份给你发过去了
        LaiYoung_:@横爬介士 加了的,解决了
        横爬介士:@LaiYoung 额。。。我能说源码被我删掉了么,你会不会是没有加代理啊

      本文标题:UITextView输入时高度自适应&文本边距的设置

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