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];
  • 相关阅读:
    NexusFile(文件管理器)
    塔式、机架式、刀片式服务器的区别和特点
    使用dsoframer控件出现"Unable to display the inactive document. Click here to reactivate the document."的问题 .
    类型“Microsoft.Office.Interop.Word.ApplicationClass”错误 4317 无法嵌入互操作类型
    解决C#导出excel异常来自 HRESULT:0x800A03EC的方法 .
    c# winfrom 皮肤切换 控件 IrisSkin2.dll 使用
    巧用花生壳将局域网内的FTP和www服务器发布到互联网
    Windows Server 2003 动态网站IIS设置(图)
    NAT原理简介、各种 ADSL Modem 及路由器的端口映射方法
    UML用例图
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/5801682.html
Copyright © 2011-2022 走看看