1.为UITextView添加placeholder
一般在UITextField里面经常会用到placeholder属性,而UITextView的placeholder属性却是私有的,无法直接调用,怎么办呢,当然是强大的kvc咯
-(void)setPlaceHolderByKVCWithString:(NSString *)placeholder forTextView:(UITextView *)textView
{
// _placeholderLabel
UILabel *placeHolderLabel = [[UILabel alloc] init];
placeHolderLabel.text = placeholder;
placeHolderLabel.numberOfLines = 0;
placeHolderLabel.textColor = [UIColor lightGrayColor];
[placeHolderLabel sizeToFit];
[textView addSubview:placeHolderLabel];
// same font
textView.font = [UIFont systemFontOfSize:18.f];
placeHolderLabel.font = [UIFont systemFontOfSize:18.f];
[textView setValue:placeHolderLabel forKey:@"_placeholderLabel"];
}
⚠️注意:textview和placeholderLabel的字体要保持一致,否则会出现,为输入之前holder向上偏移的现象。
2.监听textview的文本改变
🚩。通过消息机制来监听文本变化。uitextview内部应该是已经写好了post部分的位置,我们需要加上add方法,当文本改变时,获得消息调用方法。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textViewDidChangeText:)
name:UITextViewTextDidChangeNotification
object:_textview];
👀:这里object终于不是nil了。监听指定实际例原来是这么用的呀,厉害厉害。
- (void)textViewDidChangeText:(NSNotification *)notification
{
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
}
3.限制输入字数的方法,支持中文和英文
/**
* 最大输入长度,中英文字符都按一个字符计算
*/;
static int kMaxLength = 38;
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
// 获取键盘输入模式
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
// 中文输入的时候,可能有markedText(高亮选择的文字),需要判断这种状态
// zh-Hans表示简体中文输入, 包括简体拼音,健体五笔,简体手写
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮选择部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,表明输入结束,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
} else { // 有高亮选择的字符串,则暂不对文字进行统计和限制
NSLog(@"11111111111111======== %@",position);
}
} else {
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
if (toBeString.length > kMaxLength) {
// 截取子串
textView.text = [toBeString substringToIndex:kMaxLength];
}
}