第三方键盘和系统键盘的区别:
监听方法:[[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
你还有什么好的解决方法?欢迎留言讨论
来源:oschina
链接:https://my.oschina.net/u/4315330/blog/3528488