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. Android应用程序开机开机启动

    有很过情况都需要Android程序开机自启,也就是在手机开机之后马上执行相应的Android程序. 实现的方法就是,在手机开机的时候接受相应的广播,在Android程序中接受相应的广播. 第1步:建立 ...

  2. Navicat premium15安装破解教程

    Navicat premium15安装破解教程 注意:安装之前请卸载干净navicat,不要覆盖安装 1.去官网下载Navicat premium15的安装包 官网地址:https://www.nav ...

  3. OOM的起点到终点

    前言 1.问题及现象 线上日志反馈内存溢出问题.根据用户反馈,客户操作一段时间之后,APP 内存溢出崩溃. 2.分析过程 (1) 分析线上日志,发现主要分两种: 第一种如下,可能是某个死循环导致内存不 ...

  4. MySQL数据库的套接字文件和pid文件

    MySQL数据库的套接字文件和pid文件 socket文件:当用Unix域套接字方式进行连接时需要的文件. pid文件:MySQL实例的进程ID文件. MySQL表结构文件:用来存放MySQL表结构定 ...

  5. (PSO-BP)结合粒子群的神经网络算法以及matlab实现

    原理:           PSO(粒子群群算法):可以在全局范围内进行大致搜索,得到一个初始解,以便BP接力           BP(神经网络):梯度搜素,细化能力强,可以进行更仔细的搜索.数据: ...

  6. python selenium(常用关键字)

    1.文本按钮操作相关: send_keys()输入文本 from selenium import webdriver import time dr = webdriver.Chrome() dr.ge ...

  7. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  8. Fibonacci相关问题

    公式如下: 递归的解法我就不写了,贴一个递推的. long long Fibonacci(unsigned int n) { ) ; ) ; ; ; long long res; ; i <= ...

  9. Qt数据库总结

    使用Qt SQL库 头文件: #include <QtSql> 项目: QT += sql 常用类 QSqlDatabase:数据库的连接打开等操作 QSqlQuery:执行语句,获取结果 ...

  10. 明解JAVA 第三章答案

    练习3-1 package candle1220; import java.util.Scanner; public class Nightwatch { public static void mai ...