美文网首页iOS收集听后来的日子
UITableView+UIScrollView的键盘弹出处理

UITableView+UIScrollView的键盘弹出处理

作者: 翻炒吧蛋滚饭 | 来源:发表于2016-05-31 13:56 被阅读2186次

前言

现就职于一家拥有菜谱分享功能的App的公司,某tableView页面,有着相当多的textview和textfield,点击输入框时需要进行键盘的弹出处理,并自动滚动到相应的位置。试了一些网上分享的方法,觉得都不是很好,所以结合苹果官方文档,自己总结了一下。

正题

1、最容易存在的问题

在键盘处理的过程中,最容易出现问题的就是,在键盘监听事件中,tableView的frame的修改,网上分享的大部分都是修改frame,这样会导致tableView的cell被遮挡,可能引起获取不到cell的indexPath,导致无法滚动到指定位置
还有一点就是UITableViewController的使用,如果直接使用UITableViewController,键盘弹出事件是不用我们开发者去处理的,UITableViewController自动帮我们实现了,也就是点击cell中的输入框,就可以直接弹出到可见区域,进行编辑。但UITableViewController的view是一个tableView,也就是说,你想在这个controller里加一个固定位置的view,是不可能的,这就牺牲了页面的可定制性

2、如何去实现

- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)aNotification {
    NSDictionary* info = [aNotification userInfo];
    // 注意不要用UIKeyboardFrameBeginUserInfoKey,第三方键盘可能会存在高度不准,相差40高度的问题
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    
    // 修改滚动天和tableView的contentInset
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, kbSize.height, 0);
    self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, kbSize.height, 0);
    
    // 跳转到当前点击的输入框所在的cell
    [UIView animateWithDuration:0.2 animations:^{
        [self.tableView scrollToRowAtIndexPath:_indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }];
}

- (void)keyboardWillBeHidden:(NSNotification *)aNotification {
    self.tableView.contentInset = UIEdgeInsetsZero;
    self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero;
}

这里我们需要添加对键盘事件通知的检测,而对自己的tableView所做的改变,不是frame,而是contentInset,这样就可以保证tableView的滚动范围为键盘上方的区域,可见区域为整个屏幕。
_indexPath全局变量,需要在textfield的代理中去获取,获取到正在编辑的输入框所在的cell。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
    _indexPath = indexPath;
}

3、疑难问题

iOS8之后开始,iOS系统开始支持第三方输入法了,在第三方键盘弹出的时候,
UIKeyboardWillShowNotification会有三次通知,

- (void)keyboardWillShow:(NSNotification *)aNotification

方法会执行三次,而三次的键盘高度可能是不一样的,以最后一次高度为准,所以tableView在滚动的时候,默认的动画在多次执行时,可能会存在前一个动画没执行完成,后面的方法就不会执行,从而导致tableView无法滚动到目标位置的问题。

[self.tableView scrollToRowAtIndexPath:_indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

所以要改成如下的UIView动画,就OK了

[UIView animateWithDuration:0.2 animations:^{
        [self.tableView scrollToRowAtIndexPath:_indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }];

而掌握了以上窍门后,那tableView和scrollView想滚动到指定位置,就很简单了。

相关文章

  • UITableView+UIScrollView的键盘弹出处理

    前言 现就职于一家拥有菜谱分享功能的App的公司,某tableView页面,有着相当多的textview和text...

  • iOS处理原生和H5页面成为第一响应者弹出键盘

    1、原生UITextField处理弹出键盘: 2、H5页面弹出键盘: H5同事表示H5页面处理不了这个,需要原生端...

  • js

    处理移动安卓键盘弹出时,fiexd布局被打乱

  • 密码键盘

    水军日常。 1、弹出键盘 2、UI 3、UI界面输入删除数据处理 4、撤销键盘

  • iOS开发中关于键盘的处理

    一、通过接收键盘弹出、回退时发出的通知来进行键盘的相关的处理: 其中 toolBottomDistance 为工具...

  • Android关于键盘相关知识

    弹出键盘和收起键盘 弹出键盘 关闭键盘 监听键盘的回车键 监听键盘弹出和收起以及键盘高度 最近开发总结(关于键盘监...

  • android软键盘弹出问题

    问题: 今天公司项目处理一个软键盘弹出的逻辑,要求点击按钮之后弹出软键盘。实现代码如下: 在正常的一个activi...

  • Swift 3.1 聊天界面键盘效果

    简介 最近写的 Swift 项目里要实现一个聊天界面,在处理键盘弹出的时候遇到了一点麻烦。 麻烦就在于键盘弹出后如...

  • 键盘弹出次数>=2问题

    关于键盘弹出,发现一个奇怪的问题。app运行成功后第一次弹出键盘时,弹出键盘的监听方法会执行两次,然后再弹出键盘就...

  • 开发杂记

    做键盘弹出时,大致在一个activity的fragment中弹出键盘,布局有变化。导致键盘弹出和关闭时黑色的背景漏...

网友评论

  • 就_这样:为什么我使用修改self.tableView.contentInset值的方法 界面没有任何变化
  • f105fd19438c:感谢作者提供如此简便的方法,之前写的都是各种改frame和移坐标hhhh
    翻炒吧蛋滚饭:@Bakakun 客气客气
  • 神秘嘉宾yzj:继承tableViewController,自动处理键盘问题,当然也存在一些问题
    糊涂_hutu:@翻炒吧蛋滚饭 继承tableViewController,想让键盘弹的更高一点,有属性调整么?
    翻炒吧蛋滚饭:嗯,页面的可定制化就没那么高了
  • 西门欥雪:果然代码少,效果好!:smile: 以后就用这种方法去处理键盘了。
    翻炒吧蛋滚饭:@冷如冰寒如雪_西门吹雪 直接textview代理方法就行吧
    西门欥雪:@翻炒吧蛋滚饭 大神,请教一个问题。我在tableFooterView上放了一个UITextView,比较特殊。怎么判断是UItextField还是UITextView呢?我需要把textView顶上去。
    翻炒吧蛋滚饭:@冷如冰寒如雪_西门吹雪 哈哈,可以

本文标题:UITableView+UIScrollView的键盘弹出处理

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