添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1.png

首先回答一下@RicoCL的问题,一眨眼已经将近40天了,实在是不好意思,其实原理很简单,只要在当前文字高度 >= textView最大高度时,将textView的scrollEnable设置为YES即可,删除时,在当前文字高度 < textView最大高度时,设置为NO即可。

效果图镇楼


输入框效果图.gif

1 需求分析

平时经常用到UITextView时,经常会有这么几个问题:

placeholder 的设置 placeholder 字体颜色的设置 placeholder 字体大小的设置
  • 圆角以及边框的设置
  • UITextView 行数限制,达到最大高度时,可以滚动查看之前内容 UITextView 输入时高度自适应,包括输入以及删除时 UITextView 常常不是单独出现,例如微信输入框右侧的声音按钮,+号按钮等等。
    针对上面的几个需求,逐一分析:
  • 其中placeholder的相关属性(placeholder,字体颜色,字体大小)是通过在另外一个大小相等的 UITextView *placeholderView 的相关属性实现的,同等大小的 _placeholderView 可以完美的与之重合,是设置作为设置 placeholder View 最好选择。重写公有属性的setter方法,设置 _placeholderView 的相关属性
  • 圆角以及边框设置通过 layer 属性实现;
  • UItextView 文本最大行数公开属性,供外界调用。高度自适应,给 UITextView 设置监听,监听方法根据文本内容动态决定 UITextView 是否可以滚动。需求中因为 UITextView 常常不是单独出现,父视图有可能是一个 View ,并在父视图之间设置间距以及约束,因此设置一个block动态的根据需求改变父视图的高度。

    2 代码展示

    demo中的注释比较项目,有需要的可以直接调至文末直接下载。
    CMInputView.h文件

    #import 
    typedef void(^CM_textHeightChangedBlock)(NSString *text,CGFloat textHeight);
    @interface CMInputView : UITextView
     *  占位文字
    @property (nonatomic, strong) NSString *placeholder;
     *  占位文字颜色
    @property (nonatomic, strong) UIColor *placeholderColor;
     *  占位符字体大小
    @property (nonatomic,strong) UIFont *placeholderFont;
     *  textView最大行数
    @property (nonatomic, assign) NSUInteger maxNumberOfLines;
     *  文字高度改变block → 文字高度改变会自动调用
     *  block参数(text) → 文字内容
     *  block参数(textHeight) → 文字高度
    @property (nonatomic, strong) CM_textHeightChangedBlock textChangedBlock;
     *  设置圆角
    @property (nonatomic, assign) NSUInteger cornerRadius;
    - (void)textValueDidChanged:(CM_textHeightChangedBlock)block;
    @end复制代码

    CMTextView.m文件中核心代码的实现

    - (void)textDidChange
        // 根据文字内容决定placeholderView是否隐藏
        self.placeholderView.hidden = self.text.length > 0;
        NSInteger height = ceilf([self sizeThatFits:CGSizeMake(self.bounds.size.width, MAXFLOAT)].height);
        if (_textH != height) { // 高度不一样,就改变了高度
            // 当高度大于最大高度时,需要滚动
            self.scrollEnabled = height > _maxTextH && _maxTextH > 0;
            _textH = height;
            //当不可以滚动(即 <= 最大高度)时,传值改变textView高度
            if (_textChangedBlock && self.scrollEnabled == NO) {
                _textChangedBlock(self.text,height);
                [self.superview layoutIfNeeded];
                self.placeholderView.frame = self.bounds;
    }复制代码

    3 使用注意

    _placeholderView 的初始化是在 _placeholder 的setter方法中实现的,其中 font 的设置是与 UITextView font 是同等大小的,因此 placeholder 属性的设置需要在设置 UITextView font 之后才会生效,否则为系统默认字体大小;当然,不需要先后顺序,通过placeholderFont属性的设置也可以实现。

    Demo下载 请戳这里 欢迎star

    伯阳在成长
    私信