1,监听键盘
2,根据当前键盘弹起高度与控件的底部位置计算滑动距离
3,根据滑动距离在键盘弹起和隐藏是分别设置动画完成滑动
 
 
实现:
1,监听键盘使用
 
#pragma mark - 键盘监听
-(void)AddObserverForKeyboard
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
-(void)removeObserverForKeyboard
{
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
在viewDidAppear和viewDidDisappear中添加和移除通知
 
2,计算滑动距离
 
通知中带有键盘的高度
CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardRect.size.height;
 
获取第一响应者控件在window坐标系中的底部的Y值
window的坐标系为手机的左上角 ,通过frame转换后可以计算出控件在window坐标系中的位置相对位置,加上高度就可以算出bottom的Y值
键盘同样添加在window中,因此可以用window中的坐标系做计算。
这种计算方式复用性高,如果转换坐标系为控制器View的话,在子控制器情况下,计算的距离不是真正距离屏幕顶部的距离。
因为iOS中默认坐标系原点都为左上角,因此我们无法直接取得与底部的距离,间接计算使用的是顶部距离和高度,所以一次性取到实际与屏幕顶部的距离在计算过程中会更加方便。
关键方法
1》取到第一响应者
UIWindow *keyWindow =[[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
2》计算第一响应者在window中的相对位置
CGRect toRect = [firstResponder.superview convertRect:firstResponder.frame toView:keyWindow];
3》计算滑动距离
CGFloat firstResponderBottom = toRect.origin.y+toRect.size.height + marginValue;
CGFloat space =   firstResponderBottom + keyboardHeight  - keyWindow.frame.size.height;
 
3,masonry动画
 
self.view 为 scrollview父View
        [self.view setNeedsUpdateConstraints];
        [UIView animateWithDuration:0.25 animations:^{
            [self.scrollView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.view).offset(-space);
                make.bottom.equalTo(self.signUpButton.mas_top).offset(-space);
            }];
            [self.view layoutIfNeeded];
           
        }];
 
 
对 scrollview添加动画时,如果动画的方式是拉长scrollview,即使没有对scrollView的contentOffset操作,同样会触发scrollView的滚动代理方法,
因此滑动的思路是对scrollView整体移动。要同时修改顶部和底部的约束。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动的更多相关文章

  1. Android ScrollView 内部控件 layout_margin失效的解决方法

    在<ScrollView> 的<LinearLayout  >属性里面加入android:layout_gravity="top" <LinearLa ...

  2. Android输入控件EditText和软键盘监听

    1. 跳转到新的页面自动软键盘显示情况: 在配置清单文件AndroidManifest.xml文件,对Activity的windowSoftInputMode属性进行设置. stateUnspecif ...

  3. C#设置鼠标在控件上面时,改变光标形状

    //设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) ...

  4. VC/MFC 当鼠标移到控件上时显示提示信息

    VC/MFC 当鼠标移到控件上时显示提示信息 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法 ...

  5. WPF解决按钮上被透明控件遮盖时无法点击问题

    原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果

  6. ScrollView子控件高度设置无效

    ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView. 由于我之前布局未考虑下拉刷新功能.后来暂时发现添加上去,发现.子控件的高度 ...

  7. 使你的ActiveX控件执行时不弹出安全性提示(转载)

    我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...

  8. Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式

    Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式 摘自Unity文档 EditorGUIUtility.AddCursorRect public static void AddCursorRect ...

  9. EditorGUI控件输入监听

    EditorGUI控件输入监听 在做编辑器开放的过程中,有时候要对用户输入进行判断和限制,但EditorGUI控件却没有触发回调,而是提供了一种麻烦的办法--使用EditorGUI.BeginChan ...

随机推荐

  1. Tomcat中的类是怎么被一步步加载的?

    了解Tomcat的类加载机制,原来一切是这么的简单. 一.类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载不同的类.当用 ...

  2. centos6.X修改ssh默认端口号

    先查看下服务器端口号范围: # sysctl -a|grep ip_local_port_range net.ipv4.ip_local_port_range = 32768    61000 新ss ...

  3. 基于 react 的Java web 应用—— 组件复用(后续需更新)

    前言 实习第二周,被告知要用React与导师进行基于React的Javaweb 的开发,jinzhangaaaaa~由于React 这款框架没学过,看了一峰老师的基础入门教程,硬着头皮开始上了... ...

  4. 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图

    数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...

  5. 数学--数论--HDU1576 A / B(逆元)

    问题描述 要求(A / B)%9973,但由于A很大,我们只被告知n(n = A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1). 输入项 数据的第一行是一个T,表示有T组数据 ...

  6. 图论--树的重心(DFS) 模板

    const int maxn=500005; int tot=0,n; int ans,size; int sx[maxn],head[maxn]; int vis[maxn]; struct edg ...

  7. 用Redislive监控redis

    注意:RedisLive是使用Python2.x编写,建议使用2.7,本次环境为Centos 7.2,默认Python版本2.7. 项目地址:https://github.com/nkrode/Red ...

  8. 学习bootstarp第一天

    一.下载bootstarp(https://v3.bootcss.com/),解压并将文件放入自己项目里去使用即可  二.安装bootstarp <!DOCTYPE html> <h ...

  9. GIL-Guilds(黑白灰染色)

    传送门门门门门咩咩咩咩咩咩咩咩咩咩咩咩 \(这题真是扯谈!!!\) \(灰色很高级是吧,但是题目没要你把颜色全部用上去啊!!!\) \(黑色或者白色只有一个条件,但灰色需要和所有三种颜色都相邻.这么难 ...

  10. Spring官网阅读(十三)ApplicationContext详解(下)

    文章目录 BeanFactory 接口定义 继承关系 接口功能 1.HierarchicalBeanFactory 2.ListableBeanFactory 3.AutowireCapableBea ...