UIKeyboardTypeDecimalPad 价格键盘
- 设置tableView滚动时键盘收起
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
获取系统键盘的相关信息
NSDictionary *userInfo = [notification userInfo];
NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [value CGRectValue];
// 键盘的高度
CGFloat keyBordH = keyboardRect.size.height;
//键盘弹出需要的时间
double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
- 监听键盘弹窗、隐藏的通知一个方法就可以搞定
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)keyboardWillChangeFrame:(NSNotification *)note {
// 取出键盘最终的frame
CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
//判断键盘升起还是落下
CGFloat H = [UIScreen mainScreen].bounds.size.height - rect.origin.y;
// 取出键盘弹出需要花费的时间
double duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[self.tableView mas_updateConstraints:^(MASConstraintMaker *make) {
if (H == 0) { //键盘落下
make.bottom.equalTo(self.view).offset(- 60 );
} else { //升起
make.bottom.equalTo(self.view).offset( - H);
}
}];
//过渡动画
[UIView animateWithDuration:duration animations:^{
[self.view layoutIfNeeded];
}];
}
要处理的界面1.png 要处理的界面2.png任务评价输入框处理方案,之前开发项目键盘的处理一般都是用
IQKeyboardManager
第三方库处理的,方便快捷。但是顺丰的项目之前没有用这个库,所以不可能像之前小团队开发那样随便拿来就用了,只能自己处理键盘的遮挡和隐藏了
第一种方法:计算处理(比较容易出错,推荐使用第二种方法)
- (void)keyboardWillShow:(NSNotification *)notification {
//获取系统键盘的相关信息
NSDictionary *userInfo = [notification userInfo];
NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [value CGRectValue];
//获取键盘相对于self.view的frame ,传window和传nil是一样的
keyboardRect = [self.view convertRect:keyboardRect fromView:self.view.window];
CGFloat keyboardTop = keyboardRect.origin.y;
CGFloat keyBordH = keyboardRect.size.height;
//输入框所在的cell相对于self.view的frame
CGRect rect = [self.inputCell.superview convertRect:self.inputCell.frame toView:self.view];
CGFloat inputCellBottom = CGRectGetMaxY(rect);
//输入cell被键盘遮挡
if (keyboardTop < inputCellBottom) {
//计算view偏移量
CGFloat gap = keyboardTop - inputCellBottom;
if (fabs(gap) > keyBordH) {
//view的偏移量大于键盘高度
self.view.transform = CGAffineTransformMakeTranslation(0, -keyBordH);
[self.tableView setContentOffset:CGPointMake(0, (self.tableView.contentOffset.y + (fabs(gap) - keyBordH))) animated:NO];
} else {
//view的偏移量小于键盘高度
self.view.transform = CGAffineTransformMakeTranslation(0, gap);
}
}
}
//当键退出
- (void)keyboardWillHide:(NSNotification *)notification {
//键盘退出 还原view的位置到原始位置
self.view.transform = CGAffineTransformIdentity;
}
难点1 就是计算偏移量
思路就是把输入框所在cell的frame和键盘view的frame都进行坐标转换,转换成针对self.view的坐标
难点2 就是根据计算的偏移量改变view的frame
- 先判断输入框所在的cell是否被键盘遮挡,如果没有就不处理
- 如果遮挡了,但是偏移量
小于
键盘高度直接偏移self.view的frame即可 - 如果遮挡了,但是偏移量
大于
键盘高度,设置view的偏移量为键盘高度,同事设置tableview的contentOffset值即可
第二种简单的处理方法,推荐使用这种
晚上过代码时,登哥说你这样太麻烦了而且容易出错,有更简单的处理方法,就是利用系统的UITableViewController来进行处理。
- (UITableView *)tableView {
if (!_tableView) {
UITableViewController *controller = [[UITableViewController alloc] init];
controller.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
_tableView = controller.tableView;
_tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
[self addChildViewController:controller];
[controller didMoveToParentViewController:self];
}
return _tableView;
}
因为项目中的控制器都是继承的公共的基类控制器,所在这里不能继承UITableViewController,就用了上面的取巧的方法,然后试了一下果然奏效,登哥很给力!
网友评论