博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十二篇、高度自适应的textView
阅读量:6408 次
发布时间:2019-06-23

本文共 3931 字,大约阅读时间需要 13 分钟。

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

1.使用自定义的UIView控件

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

 

后期扩充的功能:

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

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

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

 

.h

#import 
@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];

 

转载于:https://www.cnblogs.com/HJQ2016/p/5801682.html

你可能感兴趣的文章
VS2015安装EF Power Tools
查看>>
MySQL主从复制(笔记)
查看>>
keepalived高可用集群的简单配置
查看>>
Android Java Framework显示Toast(无Activity和Service)
查看>>
通过 SignalR 类库,实现 ASP.NET MVC 的实时通信
查看>>
NavigationController修改状态条颜色
查看>>
16大跨平台游戏引擎
查看>>
NPS如何配置基于mac地址的8021x认证
查看>>
XenServer架构之XAPI的调用流程
查看>>
redhat下搭建LAMP架构
查看>>
GitHub详细教程
查看>>
raid技术的读与想
查看>>
Hbase 中Column Family 的作用
查看>>
用鸡讲解技术债务的形成过程?
查看>>
Linux下的Tftp服务
查看>>
C#将集合和Json格式互相转换的几种方式
查看>>
java连接数据库并操作
查看>>
安装.net framework 4.0时提示HRESULT 0xc8000222
查看>>
集群下文件同步问题
查看>>
ASA 5510 V821 EASY ×××配置
查看>>