1.占位符
drawRect绘制占位符,设置字体或颜色及字符变更时调用setNeedsDisplay
- (void)drawRect:(CGRect)rect {
// 如果有输入文字,就直接返回,不画占位文字
if (self.hasText) return;
//设置文字属性
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
attributes[NSFontAttributeName] = self.font;
attributes[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor grayColor];
//画文字
CGFloat x = 5;
CGFloat width = rect.size.width -2 * x;
CGFloat y = 8;
CGFloat height = rect.size.height - 2 * y;
CGRect placeholderRect = CGRectMake(x, y, width, height);
[self.placeholder drawInRect:placeholderRect withAttributes:attributes];
}
2.高度自适应,高度随内容变化
float textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height;
CGRect frame = textView.frame;
frame.size.height = textViewHeight;
textView.frame = frame;
3.限制行数,或者说是限制高度
static const CGFloat TEXTVIEW_MAX_HEIGHT = 92.5;
- (void)textViewDidChange:(UITextView *)textView{
[self setNeedsDisplay];
float textViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)].height;
if (textViewHeight>TEXTVIEW_MAX_HEIGHT) {
textView.text = self.oldEditText;
[self textViewDidChange:textView];
return;
}
[self calculateTextView:textView textViewHeight:textViewHeight];
}
- (void)calculateTextView:(UITextView *)textView textViewHeight:(CGFloat)textViewHeight{
CGRect frame = textView.frame;
frame.size.height = textViewHeight;
textView.frame = frame;
_oldEditText = textView.text;
}
我保留了textView的旧的_oldEditText,超出高度时,字符不应该变化。
4.限制字数,一个汉字当两个英文
//获得字符长度:一个汉字两个字符
- (NSInteger)getTextLength:(NSString*)text
{
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData* data = [text dataUsingEncoding:encoding];
NSInteger length = [data length];
return length;
}
OC中textView是按输入的字符个数来计算的,需要手动转换。
//textView限制字数
- (void)restrictionInputTextView:(UITextView *)textView maxNumber:(NSInteger)maxNumber{
NSString *toBeString = textView.text;
NSInteger toBeStringLength = [self getTextLength:textView.text];
NSString *lang = textView.textInputMode.primaryLanguage; // 键盘输入模式
if([lang isEqualToString:@"zh-Hans"]) { //简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
//没有高亮选择的字,则对已输入的文字进行字数统计和限制
if(!position) {
if(toBeStringLength > maxNumber) {
textView.text = [toBeString substringToIndex:maxNumber];
}
} else{ //有高亮选择的字符串,则暂不对文字进行统计和限制
}
} else{ //中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
if(toBeStringLength > maxNumber) {
//防止表情被截段
textView.text = [self subStringWith:toBeString index:maxNumber];
}
}
}
//防止原生emoji表情被截断
- (NSString *)subStringWith:(NSString *)string index:(NSInteger)index{
NSString *result = string;
if (result.length > index) {
NSRange rangeIndex = [result rangeOfComposedCharacterSequenceAtIndex:index];
result = [result substringToIndex:(rangeIndex.location)];
}
return result;
}
这一段摘自网络:一行代码解决UITextFiled和UITextView限制字数和输入特殊字符
5.当键盘遮挡输入内容时,view自动弹起
计算textView的底部高度+键盘的高度,如果大于键盘的y值,对view做一个往上偏移的动画。当取消响应时再下移,保证输入框不被键盘遮挡。