解决输入框软键盘弹出,布局整体上移问题

今天测试提了个BUG,感觉挺典型,做一下记录

问题是  在输入框在布局靠下面的时候,当弹出软键盘会把布局整体上移,导致标题没有了,键盘离的输入框特别近(虽然没有遮挡字),测试让优化一下。

百度一半天,

1.   发现添加  Android:windowSoftInputMode 属性各种添加 和滚动控件配合,出现的结果要不不能移动,要不整体移动,远远达不到想要的效果。

2. 最后想通过监听跟布局的变化,来获取布局在窗体的不可视区域大小,监听键盘弹出,从而当键盘弹出时,计算出根布局要向上滚动的高度(要点:获取指定控件的坐标,计算出要滚动的高度 ,这样 可以让布局滚到指定位置了)

     代码为:

private void beyondKeyboardLayout(final View root, final View view) {
    // 监听根布局的视图变化
    root.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect rect = new Rect();
                    // 获取内容布局在窗体的可视区域
                    root.getWindowVisibleDisplayFrame(rect);
                    // 获取内容布局在窗体的不可视区域高度(被其他View遮挡的区域高度)
                    int rootInvisibleHeight = root.getHeight() - rect.bottom;
                
                    if (rootInvisibleHeight > 120) {
                        int[] location = new int[2];
                       
                        view.getLocationInWindow(location);

                        //解决大屏幕会下移问题
                          if((location[1]+ view.getHeight())> rect.bottom){
                                
                                int buttonHeight = (location[1]
                                        + view.getHeight()) - rect.bottom;
                                root.scrollTo(0, buttonHeight);
                            }else {
                                root.scrollTo(0, 0);
                            }
                    } else {
                        // 键盘隐藏
                        root.scrollTo(0, 0);
                    }
                }
            });
}

注意:根布局必须为整个屏幕布局,当时我再写的时候开始布局为线性布局嵌套标题和滑动布局,结果发现把滑动布局当根部局无法实现滑动,改为相对布局标题放在下面,内容布局把标题的位置用控件充气来(任务栏高度动态获取,否则特定机型不好看)让整体内容布局为根布局,实现上述效果

仅做记录为以后自己在遇到类似问题方便看

参考连接https://blog.csdn.net/crazyzhangxl/article/details/80857791

 

iOS设备上,当软键盘弹出时,有时可能导致整个页面向上滚动,这通常是因为设置了自动调整视图布局(Auto Layout)的行为,尤其是当有输入框处于顶部并且设置了`adjustsScrollViewInsets`属性为`true`时。当用户聚焦于输入框,系统默认将键盘占用的空间从视图控制器的视图中减去,导致页面上移。 要解决这个问题,你可以采取以下几种策略: 1. **关闭自动调整**:在你的`ViewController`的初始化方法中,设置`prefersStatusBarHidden`为`true`并自定义管理状态栏来控制是否隐藏,同时关闭`adjustsScrollViewInsets`: ```swift override var prefersStatusBarHidden: Bool { return true } override var automaticallyAdjustsScrollViewInsets: Bool { return false } ``` 2. **手动处理键盘事件**:你可以监听`UIResponder.keyboardWillShowNotification`和`UIResponder.keyboardWillHideNotification`通知,然后相应地调整视图的位置: ```swift NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) @objc func keyboardWillChange() { guard let keyboardFrame = UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom else { return } // 根据键盘高度调整内容区域位置 self.scrollView.contentInset.top += keyboardFrame self.scrollView.scrollIndicatorInsets.top += keyboardFrame // 可能需要更新约束 layoutIfNeeded() } ``` 3. **使用`PresentationController`**:如果你使用的是SwiftUI,并且想要更现代的方式处理,可以使用`PresentationMode`来管理键盘的显示,而不是直接改变视图的`contentInset`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值