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. history of program atan2(y,x)和pow(x,y)

    编年史 1951 – Regional Assembly Language 1952 – Autocode 1954 – IPL (LISP语言的祖先) 1955 – FLOW-MATIC (COBO ...

  2. 标准库hashlib模块

    hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD5 算法(都是基于hash的算法, ...

  3. 阿里云有奖调查结果公布,赠送10个阿里巴巴logo胸针 ...

    4月17日,我们发起了"阿里云有奖调查!赠10个阿里巴巴logo胸针"活动,现经过随机抽奖机抽选出10名幸运同学,每人赠送一枚阿里巴巴胸针.现把获奖同学ID公布如下,请如下同学私信 ...

  4. 高性能服务器开发基础系列 (二)Reactor模式

    系列目录 第01篇 主线程与工作线程的分工 第02篇 Reactor模式 第03篇 一个服务器程序的架构介绍 第04篇 如何将socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于 ...

  5. Jenkins+Ansible+Gitlab自动发布/回滚Spring项目

    一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...

  6. Python基础02 变量

    Python中的变量有两个特点: 1. 无需声明 a = 1 2. 不与类型绑定 a = 1 a = 'hello world' 变量名只是内存中具体对象的一个引用(reference). 对于 a ...

  7. 入职半年多,Guide哥总结了这些帮助你领先90%程序员的好习惯!

    大家好,我是 Guide 哥,这篇文章还是不分享技术文章了,我想简单聊聊一些程序员的好习惯. 其实自己写这篇文章还是很忐忑的,毕竟自己算不上一个优秀的程序员,但也不是那么差.大学学习编程 4 年,工作 ...

  8. 数据结构与算法:栈(Stack)的实现

    栈在程序设计当中是一个十分常见的数据结构,它就相当于一个瓶子,可以往里面装入各种元素,最先装进这个瓶子里的元素,要把后装进这个瓶子里的全部元素拿出来完之后才能够把他给拿出来.假设这个瓶子在桌上平放,左 ...

  9. docker-compose安装rabbitmq

    编写时间:2020-05-08 参考文档:docker安装rabbitmq 1. 编写docker-compose.yml version: '3' services: rabbitmq: image ...

  10. OpenWrt(LEDE)2020.4.29更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成+软件包

    交流群:QQ 1030484865 电报:  t_homelede   固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.29)Lienol Feed及若干自行维护 ...