iOS知识整理:使用UITextView可能在项目中遇到的问题

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];
        }
    }

你可能感兴趣的:(iOS知识整理:使用UITextView可能在项目中遇到的问题)