• 避免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整体移动。要同时修改顶部和底部的约束。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    服务命令Linux安装配置apache
    枚举参考hdu2062Subset sequence
    异常选择struts2文件上传产生Source 'xxxx.tmp' does not exist
    序列插入常用排序算法 总结
    代码nullMerge two sorted linked lists
    下载文件win8mp3下载
    希望判断创造、改变世界的基因
    qemulauncher:图形化的QEMU启动器
    Virtual Memory I: the problem
    HIGHMEM
  • 原文地址:https://www.cnblogs.com/huaida/p/11025273.html
Copyright © 2020-2023  润新知