zoukankan      html  css  js  c++  java
  • 第十二篇、高度自适应的textView

    高度根据输入内容变化输入框,我们在很多的应用上都可以见到,如微信、QQ聊天,QQ空间评论等等,该输入框可以用xib,纯代码编写,但是个人觉得纯代码编写用起来更加方便一些。

    1.使用自定义的UIView控件

    2.通过改变textView的中的内容改变textView的frame,在改变父类视图的frame

    后期扩充的功能:

    3.后期需要扩充表情,发送按钮等等

    4.最好是给textView设置一个最大的高度和记录起始的高度(方便恢复原状)

    5.布局方式换成约束的方式稍微好点

    .h

    #import <UIKit/UIKit.h>
    
    @interface CQTextView : UIView
    
    @property (nonatomic,copy) NSString *placeholder;
    @property (nonatomic,strong) UIFont *font;
    
    @end

    .m

    #import "CQTextView.h"
    
    @interface CQTextView (){
        /** 记录初始化时的height,textview */
        CGFloat _initHeight;
    }
    
    @property (nonatomic,strong) UITextView *textView;
    /** placeholder的label */
    @property (nonatomic,strong) UILabel *placeholderLabel;
    
    @end
    
    @implementation CQTextView
    
    /** 重写初始化方法 */
    - (instancetype)initWithFrame:(CGRect)frame{
        if (self = [super initWithFrame:frame]) {
            // 记录初始高度
            _initHeight = frame.size.height;
            self.clipsToBounds = NO;
    
            // 添加textView
            self.textView = [[UITextView alloc]initWithFrame:self.bounds];
            [self addSubview:self.textView];
            self.textView.delegate = (id)self;
            self.textView.backgroundColor = [UIColor clearColor];
    
            // 添加placeholderLabel
            self.placeholderLabel = [[UILabel alloc]initWithFrame:CGRectMake(3, 0, frame.size.width - 3, frame.size.height)];
            [self addSubview:self.placeholderLabel];
            self.placeholderLabel.backgroundColor = [UIColor clearColor];
            self.placeholderLabel.textColor = [UIColor lightGrayColor];
        }
        return self;
    }
    
    // 赋值placeholder
    - (void)setPlaceholder:(NSString *)placeholder{
        _placeholder = placeholder;
        self.placeholderLabel.text = placeholder;
        [self.placeholderLabel sizeToFit];
        self.placeholderLabel.center = self.textView.center;
    }
    
    // 赋值font
    - (void)setFont:(UIFont *)font{
        self.textView.font = self.placeholderLabel.font = font;
        // 重新调整placeholderLabel的大小
        [self.placeholderLabel sizeToFit];
        self.placeholderLabel.center = self.textView.center;
    }
    
    /** textView文本内容改变时回调 */
    - (void)textViewDidChange:(UITextView *)textView{
        // 计算高度
        CGSize size = CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX);
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:self.textView.font,NSFontAttributeName, nil];
        CGFloat curheight = [textView.text boundingRectWithSize:size
                                                        options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                                     attributes:dic
                                                        context:nil].size.height;
        // 如果高度小于初始化时的高度,则不赋值(仍采用最初的高度)
        if (curheight < _initHeight) {
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, _initHeight);
            self.textView.frame = CGRectMake(self.textView.frame.origin.x, self.textView.frame.origin.y, self.textView.frame.size.width, _initHeight);
        }else{
            // 重新给frame赋值(改变高度)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, curheight+20);
            self.textView.frame = CGRectMake(self.textView.frame.origin.x, self.textView.frame.origin.y, self.textView.frame.size.width, curheight+20);
        }
    
        // 如果文本为空,显示placeholder
        if (textView.text.length == 0) {
            self.placeholderLabel.hidden = NO;
            self.placeholderLabel.center = self.textView.center;
        }else{
            self.placeholderLabel.hidden = YES;
        }
    }
    
    @end

    使用示例:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        CQTextView *textView = [[CQTextView alloc]initWithFrame:CGRectMake(90, 90, 100, 30)];
        [self.view addSubview:textView];
        textView.backgroundColor = [UIColor redColor];
        textView.font = [UIFont systemFontOfSize:20];
        textView.placeholder = @"ss";
    }


    注意:

    光标的位置还需要调整一下,不然不居中,要回到原位。

    [textView setContentOffset:CGPointZero animated:YES];
    [textVeiw scrollRangeToVisible:textView.selectedRange];
  • 相关阅读:
    Hibernate课程 初探多对多映射2-4 测试
    Hibernate课程 初探多对多映射3-1 课程总结
    Hibernate课程 初探多对多映射2-3 配置映射文件
    Hibernate课程 初探多对多映射2-2 创建持久化类和映射文件
    Hibernate课程 初探多对多映射2-1 创建数据库表
    Hibernate课程 初探多对多映射1-1 多对多应用场景
    Hibernate课程 初探一对多映射5-3 Eclipse根据表反向生成实体类
    Hibernate课程 初探一对多映射5-2 Eclipse添加数据库连接
    touch上滑加载
    touch下拉刷新
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/5801682.html
Copyright © 2011-2022 走看看