cell中有UITextView时,输入文字是需要将tableView向上移,基本的做法是,注册键盘变化的通知在通知的方法中做tableVIew的位置调整,

一,一般做法

- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
    NSLog(@"register");
}

- (void)keyboardWasShown:(NSNotification *)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    ///将内边距进行调整
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
}

- (void)keyboardWillBeHidden:(NSNotification *)aNotification {

UIEdgeInsets contentInsets = UIEdgeInsetsZero;
}
今天做项目发现以上方法有一定缺陷,当tableView有多组的时候,有一组cell不跟着向上移动照成如下情况:

当键盘出现时,尾视图向上移动了但是这一组中的cell没有向上移动,这是什么原因,我至今没有搞清楚.

上述方法还会出现问题

解决办法找到了就是在键盘出现的通知方法中找到第一响应者(一般是:UITextField),判断它所在的cell是否显示在可见区域,如果没有则让tableVIew滑动至该cell全部可见:

#pragma mark 键盘出现

-(void)keyboardWillShow:(NSNotification *)note

{

CGRect keyBoardRect=[note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

//取得第一响应者

UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];

UIView *activeField = [keyWindow performSelector:@selector(firstResponder)];

//使用了苹果的私有方法,将无法上传到App Store,下一篇介绍不使用该方法获取第一响应者

//除去键盘后的页面显示区域

CGRect aRect = self.view.frame;

aRect.size.height =  aRect.size.height - keyBoardRect.size.height - 64;

///修改arect:


CGRect tableReact = self.tableView.frame;

float y = _tableView.contentOffset.y;

tableReact.origin.y += y;

tableReact.size.height -= keyBoardRect.size.height;

aRect = tableReact;

//判断cell底部是否在显示范围内

CGPoint cellBottomPoint = CGPointMake(0.0, activeField.superview.superview.frame.origin.y +activeField.superview.superview.frame.size.height);

if (!CGRectContainsPoint(aRect, cellBottomPoint) ) {

self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyBoardRect.size.height, 0);

CGPoint scrollPoint = CGPointMake(0.0, cellBottomPoint.y-aRect.size.height -44);

[_tableView setContentOffset:scrollPoint animated:YES];

}

}

#pragma mark 键盘消失

-(void)keyboardWillHide:(NSNotification *)note

{

[UIView animateWithDuration:.35 animations:^{

self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 45, 0);

}];

}

这样就完美解决了以上问题;

当cell中有UItextfiled或者UITextVIew时,弹出键盘把tableview往上,但是有的cell没有移动的更多相关文章

  1. UITableView中cell里的UITextField不被弹出键盘挡住

    UITableView中cell里的UITextField不被弹出键盘挡住 本人视频教程系类   iOS中CALayer的使用 效果如下: 源码: EditCell.h 与 EditCell.m // ...

  2. ios兼容 input输入时弹出键盘框 页面整体上移键盘框消失后在ios上页面不能回弹的问题

    前端h5混合开发手机端ios  当有input输入时,手机下方弹出键盘使页面上移,当输入完成,键盘消失后页面显示回到原位,但实际不能点击(可点击上方区域,有反应),也就是说实际是没有回弹. 解决办法: ...

  3. Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法

    Visual Studio2012打开时弹出"遇到异常:这可能是由某个扩展导致的"错误的解决办法: 具体问题如下: 分析原因:网上搜集了以下,出现异常的原因是安装了第三方控件,然后 ...

  4. loadrunner录制时弹出invalid application path!please check if application exists对话框

    问题:oadrunner录制时弹出invalid application path!please check if application exists对话框 原因:IE浏览器地址不对,需要手动重新选 ...

  5. [转]Android在初始化时弹出popwindow的方法 .

    转自:http://blog.csdn.net/sxsboat/article/details/7340759 留个人备用0.0 Android中在onCreate()时弹出popwindow,很多人 ...

  6. 解决在IE里预览时弹出:为了有利于保护安全性......

    用Dreamweaver做网页,在IE里预览时弹出这个:为了有利于保护安全性,Internet Explorer 已限制此网页运行可以访问计算机的脚本或ActiveX控件. 在页面顶部加段代码就可以了 ...

  7. Android在初始化时弹出popwindow的方法

     http://blog.csdn.net/sxsboat/article/details/7340759 Android中在onCreate()时弹出popwindow,很多人都有过类似的需求吧,但 ...

  8. Android定位&地图&导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二. ...

  9. VS2015+OpenGL4.0开发编译时弹出错误:glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符号在函数 _GetRegistrySysColors@8 中被引用

    一.问题描述: VS2015+OpenGL4.0开发编译时弹出如下所示的错误: 1>glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符 ...

随机推荐

  1. css网页布局模板

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 使用session存储,购物车结算add_to_order.php(学生笔记)

    <?php session_start(); include_once("DB.class.php"); //接受并解析前端传过来的json,转换成数组. $goods_li ...

  3. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之十一:SQL Server配置Always On后D365的配置更改

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  4. 射频IC卡和IC卡读卡器的成本分析

    当今射频IC卡和IC卡读卡器的种类繁多,很多人问IC卡读卡器多少钱,那么如何在满足我们需求的情况下最大的节省成本呢.下面就各种射频IC卡和IC卡读卡器来分析下各自的成本.                ...

  5. [20191115]oracle实例占用内存计算.txt

    [20191115]oracle实例占用内存计算.txt --//以前学习oracle数据库时,总想了解实例占用内存多少,我曾经在一些会议底下问过一位高手,对方说计算这个相对很难,许多东西是共享的.- ...

  6. SQL Server查询数据库近期执行的SQL语句

    SELECT TOP 1000        ST.text AS '执行的SQL语句',       QS.execution_count AS '执行次数',       QS.total_ela ...

  7. Linux方案级ROM/RAM优化记录

    关键词:readelf.bloat-o-meter.graph-size.totalram_pages.reserved.meminfo.PSS.procrank.maps等等. 根据项目的需求,进行 ...

  8. 小计C++中的引用和vector

    声明引用的同时必须对其初始化,否则系统会报错,所以我们是无法这样使用 vector<int &> vec; 这条语句会报错,同时引用不是定义一个新的变量或对象,因此内存不会为引用开 ...

  9. macOS 10.15 开启 HiDPI

    普通的显示,接上 MacBook 发现原生的分辨率设置在 2K 显示器上字体很小,换成 1080P 分辨率显示效果又特别模糊.下面介绍MacBook强行开启 HiDPI. 什么是 HiDPI 它使用横 ...

  10. 2019面向对象程序设计(Java) 第16周学习指导及要求

    2019面向对象程序设计(Java)第16周学习指导及要求 (2019.12.13-2019.12.16) 学习目标 (1) 掌握Java应用程序的打包操作: (2) 掌握线程概念: (3) 掌握线程 ...