高度根据输入内容变化输入框,我们在很多的应用上都可以见到,如微信、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];