UItextview在项目中的使用:
一般在项目中使用这个控件,是为了实现像下面的效果。下面我们就来一起实现一下。
在.h文件里面
{
UITextView *tvRemark; // 反馈内容
UILabel *labNumber; // 字数
}
在.m文件里面
- (void)viewDidLoad {
// 输入内容
UIView *viewRemark = [[UIView alloc] init];
viewRemark.backgroundColor = [UIColor whiteColor];
[self.view addSubview:viewRemark];
UILabel *labRemark = [[UILabel alloc] init];
labRemark.text = @"反馈内容";
labRemark.font = [UIFont systemFontOfSize:15];
labRemark.textColor = [UIColor blackColor];
[viewRemark addSubview:labRemark];
UILabel *labTag = [[UILabel alloc] init];
labTag.textColor = [UIColor redColor];
labTag.text = @"*";
[viewRemark addSubview:labTag];
tvRemark = [[UITextView alloc] init];
tvRemark.font = [UIFont systemFontOfSize:13];
tvRemark.delegate = self;
[viewRemark addSubview:tvRemark];
// _placeholderLabel
UILabel *placeHolderLabel = [[UILabel alloc] init];
placeHolderLabel.text = @"请填写10字以上的问题描述,以便我们更好地帮助您解决问题";
placeHolderLabel.numberOfLines = 0;
placeHolderLabel.textColor = [UIColor lightGrayColor];
[placeHolderLabel sizeToFit];
placeHolderLabel.font = [UIFont systemFontOfSize:13.f];
[tvRemark addSubview:placeHolderLabel];
[tvRemark setValue:placeHolderLabel forKey:@"_placeholderLabel"];
labNumber = [[UILabel alloc] init];
labNumber.textColor = [UIColor lightTextColor];
labNumber.font = [UIFont systemFontOfSize:13];
labNumber.text = @"0/200";
[viewRemark addSubview:labNumber];
// 下面使用的是Masonry第三方的 SDK进行的控件的布局
[viewRemark mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(viewPic.mas_bottom).offset(10);
make.height.mas_equalTo(168);
make.width.mas_equalTo(SCREEN_WIDTH);
}];
[labRemark mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(15);
make.top.mas_equalTo(viewRemark.mas_top).offset(8);
make.height.mas_equalTo(20);
}];
[labTag mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(labRemark.mas_right).offset(5);
make.top.bottom.mas_equalTo(labRemark);
}];
[tvRemark mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(15);
make.right.mas_equalTo(-15);
make.top.mas_equalTo(labRemark.mas_bottom).offset(8);
make.height.mas_equalTo(100);
}];
[labNumber mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(-15);
make.top.mas_equalTo(tvRemark.mas_bottom).offset(8);
make.height.mas_equalTo(15);
make.bottom.mas_equalTo(viewRemark.mas_bottom).offset(-20);
}];
}
下面的代码是比较重要的,方法是textview的UITextViewDelegate。是控制输入文字数量的变化。
在.m文件里面
-(void)textViewDidChange:(UITextView *)textView{
NSString *lang = textView.textInputMode.primaryLanguage; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]){
UITextRange *selectedRange = [textView markedTextRange];
if (!selectedRange) { // 没有高亮
if (textView.text.length>200) { // 输入的文字大于设定的长度 这里设置的是200个字符
tvRemark.text = [textView.text substringToIndex:200];
}else{
tvRemark.text = textView.text;
}
labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)textView.text.length];
}else{
}
}else{
if (textView.text.length>200) {
tvRemark.text = [textView.text substringToIndex:200];
}else{
tvRemark.text = textView.text;
}
labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)textView.text.length];
}
}
tvRemark是初始化的UItextview; labNumber是要显示输入文字多少的UIlabel控件。其中
[lang isEqualToString:@"zh-Hans"] 这句话是要判断是否是中文,防止英文同步计算在内。
selectedRange 判断TextView是否处于高亮选中的状态。
textView.text.length 表示当前输入的文本的数量。
在之后的使用过程中,同事发现了问题。使用上面的-(void)textViewDidChange:(UITextView *)textView会出现一句话中间输入之后直接跳转到末尾的问题。于是进行了修改。如下:
-(void)textViewDidChange:(UITextView *)textView{
NSString *lang = textView.textInputMode.primaryLanguage;//键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]){
UITextRange *selectedRange = [textView markedTextRange];
if (!selectedRange) {//已经标记的文本
if (textView.text.length>200) {
self.tvRemark.text = [textView.text substringToIndex:200];
}
}
}else{
if (textView.text.length>200) {
self.tvRemark.text = [textView.text substringToIndex:200];
}
}
self.labNumber.text = [NSString stringWithFormat:@"%lu/200",(unsigned long)self.tvRemark.text.length];
if (_delegate && [_delegate respondsToSelector:@selector(CtextViewTextChange:)]) {
[self.delegate CtextViewTextChange:self.tvRemark.text];
}
}
通过以上的代码就可以实现UItextview常用的页面状态了。如果上面的代码在多个地方使用,建议新建一个类,将代码进行统一管理。