iOS 关于第三方键盘

 

第三方键盘和系统键盘的区别:

      监听方法:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

系统键盘会调用一次,keyboardWillShow:,而第三方键盘会调用三次。

 

出现的问题

      在一些页面,textField 在页面底部,弹出键盘时会遮挡输入框,需要计算上移的高度,做一些上移。

  我是这么来做的

- (void)keyboardWillShow:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [aValue CGRectValue];
    
    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval animationDuration;
    [animationDurationValue getValue:&animationDuration];
    
    CGRect responderConvertedFrame = [_firstRespondTF.superview convertRect:_firstRespondTF.frame toView:self.view];
    CGRect keyboardConvertedFrame = [self.view.window convertRect:keyboardRect toView:self.view];
    CGFloat needOffsetY = responderConvertedFrame.origin.y + responderConvertedFrame.size.height - keyboardConvertedFrame.origin.y;
    
    // 如果要移动距离大于0说明有遮盖,说明需要移动
    if (needOffsetY > 0) {
        // scrollView现在的偏移量 + 需要移动的偏移量 = 最终要设置的偏移量
        CGFloat offsetY = needOffsetY + self.scrollView.contentOffset.y;
        CGFloat maxOffsetY = self.scrollView.contentSize.height - self.scrollView.height;
        if (offsetY <= maxOffsetY) {
            self.contentInsetBottom = 0;
            [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, offsetY) animated:YES];
        }else {
            self.contentInsetBottom = ceil(offsetY - maxOffsetY);
            self.scrollView.contentInset = UIEdgeInsetsMake(self.scrollView.contentInset.top, self.scrollView.contentInset.left, self.scrollView.contentInset.bottom + self.contentInsetBottom, self.scrollView.contentInset.right);
            [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, offsetY) animated:YES];
        }
    }
}


- (void)keyboardWillHide:(NSNotification *)notification
{
    self.scrollView.contentInset = UIEdgeInsetsMake(self.scrollView.contentInset.top, self.scrollView.contentInset.left, self.scrollView.contentInset.bottom - self.contentInsetBottom, self.scrollView.contentInset.right);
    self.contentInsetBottom = 0;
}

 

  系统键盘时,完全没有问题;

  当是第三方键盘时,由于走了三遍,就出现了错误。

 

解决问题

         第一种方法:禁用第三方键盘

          很多文章都提到了下面这个方法:

- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier  {
     return NO;
}

       该方法的确可以禁用掉第三方键盘,但是整个APP 中,都禁用掉了。而有时候,我们只是在某些界面禁用第三方键盘。

 

       第二种方法:利用 textField 的 secureTextEntry 属性

         当该属性被设置为 YES 时,可能是苹果为了安全考虑,第三方键盘是无法弹出的。当然你可能说,这样输入的内容就变成黑点了,我们可以在键盘出现之后再改回来。

         我们在该方法中,设置一下

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  if (textField == _agencyTF) {
    textField.secureTextEntry = YES;
    textField.font = nil;
    textField.font = FONTSIZE(14);
  }
}

 

   然后再设置回来

- (void)keyboardWillShow:(NSNotification *)notification{  
  if (_agencyTF.secureTextEntry == YES) {
    _agencyTF.secureTextEntry = NO;
    _agencyTF.font = nil;
    _agencyTF.font = FONTSIZE(14);
  }
}

 

  第三种方法:推荐使用第三方 IQKeyboardManager

    使用IQKeyboardManager可以很容易地解决弹起键盘遮盖输入框的问题。

        地址:https://github.com/hackiftekhar/IQKeyboardManager

 

你还有什么好的解决方法?欢迎留言讨论

 

posted @ 2019-05-22 14:15  侯文超  阅读(1035)  评论(0编辑  收藏  举报