美文网首页
TextField和TextView输入框 防遮挡的另一种做法

TextField和TextView输入框 防遮挡的另一种做法

作者: 衡道众 | 来源:发表于2020-05-16 11:54 被阅读0次
    1589600192282826.gif

    前言:这个输入框基本可以解决textView使用过程中的大部分问题

    1.调用,用起来也算方便

    HYInputTextView *input = [[HYInputTextView alloc] initWithTitle:@"输入框测试" content:self.centerTextView.text andMaxCount:200 saveBlock:^(NSString * _Nonnull inputContent) {
            self.centerTextView.text = inputContent;
        }];
    

    2.字数限制

    - (void)setMax:(int)max {
        _max = max;
        _countLabel.text = [self countForContentString:self.content];
    }
    
    - (void)setContent:(NSString *)content {
        _content = content;
        self.inputView.text = content;
        _countLabel.text = [self countForContentString:content];
        [self updateSelfOfTextViewSize];
    }
    
    - (NSString *)countForContentString:(NSString *)content {
        if (!content) content = @"";
        return [NSString stringWithFormat:@"(%li/%i)",content.length,self.max];
    }
    
    - (void)textViewDidChange:(UITextView *)textView {
    #pragma mark-----------注意次序
        // 文字计算
        UITextRange *selectedRange = [textView markedTextRange];
        //获取高亮部分
        UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
        //如果在变化中是高亮部分在变,就不要计算字符了
        if (selectedRange && pos) {
            return;
        }         
        // 去掉英文没满一行就换行
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
        paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
        NSDictionary *attributes = @{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:INPUT_FONT]};
        textView.attributedText = [[NSAttributedString alloc]initWithString:textView.text attributes:attributes];
        
        if ((unsigned long)textView.text.length > self.max) {
            // 对超出的部分进行剪切
            textView.text = [textView.text substringToIndex:self.max];
        } else {
            //动态调整textView的高度
            [self updateSelfOfTextViewSize];
        }
        self.countLabel.text = [self countForContentString:textView.text];
    }
    

    3.动态调整textView的高度

    - (void)updateSelfOfTextViewSize {
        //* TextView 大小*/
        CGRect inputF = self.inputView.frame;
        CGSize maxSize = CGSizeMake(inputF.size.width, CGFLOAT_MAX);
        CGSize newSize = [self.inputView sizeThatFits:maxSize];
        CGFloat maxHeight = MIN(INPUT_MAX_HEIGHT, newSize.height);
        if (inputF.size.height ==maxHeight) return;
        [self changeFrameForTextHeight:maxHeight];
        //让text的内容平滑居中
        [self.inputView scrollRangeToVisible:NSMakeRange(0, 0)];
    }
    
    - (void)changeFrameForTextHeight:(CGFloat)height {
        CGRect inputF = self.inputView.frame;
        inputF.size.height = height;
        //改变自己的高度
        CGRect rect = self.frame;
        rect.size.height = self.oldHeight -TEXTVIEW_ACTION_HEIGHT + height;
        rect.origin.y = rect.origin.y-(rect.size.height-self.frame.size.height);
        // 改变backgrund高度
        CGRect backF = self.centerBackgrundView.frame;
        backF.size.height = rect.size.height -BACKGRUND_HEIGHT;
        // 改变Button高度
        CGRect buttonF = self.sureButton.frame;
        buttonF.origin.y = CGRectGetMaxY(inputF) + INPUTVIEW_TOP;
        [UIView animateWithDuration:.3 animations:^{
            self.inputView.frame = inputF;
            self.sureButton.frame = buttonF;
            self.centerBackgrundView.frame = backF;
            self.frame = rect;
        }];
    }
    

    4.键盘弹出相关

    #pragma mark - 键盘事件监听
    - (void)initKeyboardObserver
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    }
    
    - (void)keyboardWillShow:(NSNotification*)notification {
        NSLog(@"键盘即将弹出");
        NSValue* keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardRect = [keyboardBoundsValue CGRectValue];
        
        NSNumber* keyboardAnimationDur = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey];
        float animationDur = [keyboardAnimationDur floatValue];
        
        _keyboardShowTime++;
        // 第三方输入法有bug,第一次弹出没有keyboardRect
        if (animationDur > 0.0f && keyboardRect.size.height == 0) {
            _isThirdPartKeyboard = YES;
            NSLog(@"第三方");
        }
        // 第三方输入法,有动画间隔时,没有高度
        if (_isThirdPartKeyboard) {
            // 第三次调用keyboardWillShow的时候 键盘完全展开
            if (_keyboardShowTime == 3 && keyboardRect.size.height != 0 && keyboardRect.origin.y != 0) {
                _keyboardFrame = keyboardRect;
                //Animate change
                [self showKeyBoardAnimation];
            }
            if (animationDur > 0.0) {
                _keyboardAnimateDur = animationDur;
            }
        } else {
            if (animationDur > 0.0) {
                _keyboardFrame = keyboardRect;
                _keyboardAnimateDur = animationDur;
                [self showKeyBoardAnimation];
            }
        }
    }
    
    - (void)keyboardDidShow:(NSNotification*)notification {
        _isKeyboardShow = YES;
        if (_keyboardAnimateDur ==0) {
            NSValue* keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
            self.keyboardFrame = [keyboardBoundsValue CGRectValue];
            _keyboardAnimateDur = 0.3f;
            [self showKeyBoardAnimation];
        }
    }
    
    - (void)keyboardWillHide:(NSNotification*)notification {
        NSNumber* keyboardAnimationDur = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey];
        float animationDur = [keyboardAnimationDur floatValue];
     
        _isThirdPartKeyboard = NO;
        _keyboardShowTime = 0;
        
        if (animationDur > 0.0){
            [_overView removeFromSuperview];
            CGRect rect = self.frame;
            rect.origin.y = MAINSCREEN_HEIGHT;
            [UIView animateWithDuration:_keyboardAnimateDur animations:^{
                self.frame = rect;
    //            [self layoutIfNeeded];
    //            [self layoutSubviews];
            } completion:^(BOOL finished) {
                [self removeFromSuperview];
            }];
        }
    }
    
    - (void)keyboardDidHide:(NSNotification*)notification {
        _isKeyboardShow = NO;
    }
    
    // 弹出视图
    - (void)showKeyBoardAnimation {
        CGRect rect = self.frame;
        rect.origin.y = MAINSCREEN_HEIGHT- self.keyboardFrame.size.height-rect.size.height;
        [UIView animateWithDuration:_keyboardAnimateDur animations:^{
            self.frame= rect;
    //        [self layoutIfNeeded];
    //        [self layoutSubviews];
        }];
    }
    

    相关文章

      网友评论

          本文标题:TextField和TextView输入框 防遮挡的另一种做法

          本文链接:https://www.haomeiwen.com/subject/dhplohtx.html