1. 程式人生 > >限制UITextView輸入字數

限制UITextView輸入字數

整理自: http://blog.csdn.net/fengsh998/article/details/45421107 , 基本就是照搬下來的程式碼,所以算是轉載吧

和普通的有些區別

所謂普通的就是: 打王者榮耀時你趁著等復活的時候抓緊時間打了一句話結果輸入到一半的時候突然由於字數限制直接變成了沒有拼完的拼音,於是你只好按詞語的首拼甚至一個字母從候選裡找出你想要的字,或者一句話分成兩次發...

明明還有幾個字的餘地,就是不讓好好輸入, 真是糾結啊......

區別就是: 下面這種方式是按多長的拼音都不會半路被截變成拼音, 等你按下候選詞後才會擷取

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    UITextRange *selectedRange = [textView markedTextRange];
    //獲取高亮部分
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
    //獲取高亮部分內容
    //NSString * selectedtext = [textView textInRange:selectedRange];
    
    //如果有高亮且當前字數開始位置小於最大限制時允許輸入
    if (selectedRange && pos) {
        NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];
        NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];
        NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);
        
        if (offsetRange.location < _limit) {
            return YES;
        } else {
            return NO;
        }
    }
    
    NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];
    
    NSInteger caninputlen = _limit - comcatstr.length;
    
    if (caninputlen >= 0) {
        return YES;
    } else {
        NSInteger len = text.length + caninputlen;
        //防止當text.length + caninputlen < 0時,使得rg.length為一個非法最大正數出錯
        NSRange rg = {0,MAX(len,0)};
        
        if (rg.length > 0) {
            NSString *s = [text substringWithRange:rg];
            
            [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];
            //超出部分擷取,設定limitLab的text
            [self setLimitText];
        }
        return NO;
    }
}

- (void)textViewDidChange:(UITextView *)textView {
    UITextRange *selectedRange = [textView markedTextRange];
    //獲取高亮部分
    UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
    
    //如果在變化中是高亮部分在變,就不要計算字元了
    if (selectedRange && pos) {
        return;
    }
    
    NSString  *nsTextContent = textView.text;
    NSInteger existTextNum = nsTextContent.length;
    
    if (existTextNum > _limit) {
        //擷取到最大位置的字元
        textView.text = [nsTextContent substringToIndex:_limit];
    }
    
    [self setLimitText];
}
- (void)setLimitText {
    _limitLab.text = [NSString stringWithFormat:@"%ld/%d",MAX(0,_limit - _majorTV.text.length), _limit];
    if (_limit - _majorTV.text.length < 16) {
        _limitLab.textColor = [UIColor redColor];
    } else {
        _limitLab.textColor = HexColor(0x999999, 1);
    }
}

其中_limit是限制的字數, _limitLab是用來顯示當前字數和最大字數的, _majorTV是被限制字數的UITextView