避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动

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整体移动。要同时修改顶部和底部的约束。

参考资料:https://blog.csdn.net/qq_16259395/article/details/78974216

原文地址:https://www.cnblogs.com/huaida/p/11025273.html

时间: 2024-10-08 02:28:43

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

Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息.但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证.下面来看看一看这个认证的工作过程:第一步:  客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话,服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息.如下图.第二步:浏览器在接受到401 Unauthozie

【回味无穷】ASP.NET内部控件

ASP.NET引入一组称为"内部控件"的新控件,它们专门用于ASP.NET.内部控件的使用方法与HTML控件相同,他们映射到HTML元素并通过使用runat="server"属性在服务器上执行.内部控件和HTML控件的显示格式是不一样的,HTML控件书写如下: <input type="checkbox">    <input type="radio">; 而内部控件的书写格式如下: <asp:c

ScrollView子控件高度设置无效

ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView, 因为我之前布局未考虑下拉刷新功能.后来临时发现增加上去,发现.子控件的高度无法设置.无论怎么设置,一直显示不出来. 后来查阅API文档: 所以在你的ScrollView属性里加入这一句话即可: android:fillViewport="true" 版权声明:本文为博主原创文章,未经博主允许不得转载.(转载请注明出自 AllenCoder)

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

//设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) { this.Cursor = Cursors.Hand; } private void pictureBox_macroLogo_MouseLeave(object sender, System.EventArgs e) { this.Cursor = Cursors.Default; }

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

VC/MFC 当鼠标移到控件上时显示提示信息 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法. 一般用法步骤:  添加CToolTipCtrl成员变量 m_tt.  在父窗口中调用EnableToolTips(TRUE);  在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool(pW

wpf控件设计时支持(3)

原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配置成外部的visual studio ide启动程序devenv.exe (2)F5启动调试然后会打开一个新的visual studio ide,这个时候要记得重新打开你要调试的那个项目. 以上两个步骤就可以实现设计时调试了 2.编辑模型体系 当选中某些控件出现的设计时,这个选中的控件便成了可编辑的

scrollView中内部控件的悬停

以下图为例,图片,红色view和蓝色view是添加在scrollView上的,向上拖动,红色view停留在屏幕顶端不动,其它的继续滚动,向下拖动后,红色view跟着下来 代码如下:(注意的是scrollView中自动布局的设置问题) 1 #import "ViewController.h" 2 @interface ViewController () <UIScrollViewDelegate> 3 @property (weak, nonatomic) IBOutlet

activex控件开发时如何用ie8进行调试

这阵子在搞一个activex的项目,发现dll型的输出控件比较难调试,导致我郁闷了几天了,调试不进去的话就定位不到错误,后面的工作就受阻了.试了好多种方法都不行,原来是不了解ie所致的.好像自从4.0以后,ie在我们打开一个网页时,会启动一个主的进程,和一个副进程,ie的调试器只touch到副进程是不行的,还得touch到主进程才可以.这个我也不确定是否正确,不过要使vs调试到activex工程里面去的话,我们还得按照下面的方法做. 第一步:选择activex项目,打开项目属性,在"config

scrollView滑动控件

sd 是iOS中的滑动控件,可以来解决当药显示内容个区域超过屏幕大小时,可以通过滑动操作看全内容区域,他是滑动控件的基类.UITableView.UITextView的父类 属性 设置内容区域的大小 contentSize 关闭水平指示器 showsHorizontalScrollIndicator 关闭竖直指示器 showsVerticalScrollIndicator 设置是否可以滑动 scrollEnabled 关闭反弹效果 bounces 设置偏移量 contentOffset其实是修改