UnityEngine.TouchScreenKeyboard.visible异常:如何准确检测手机键盘完全显示?
准确检测Unity手机键盘是否完全显示的方法
针对TouchScreenKeyboard.visible返回值不准确的问题,你可以试试以下几种可靠的检测方案:
通过屏幕可用高度变化判断
键盘弹出会挤压屏幕可用区域,导致实际可用高度降低。可以对比初始屏幕高度与当前高度的差值,设置合理阈值过滤微小波动:private float _initialScreenHeight; void Start() { _initialScreenHeight = Screen.height; } void Update() { // 100为阈值,可根据设备测试调整,避免误判屏幕微小变化 bool isKeyboardVisible = Screen.height < _initialScreenHeight - 100; // 这里使用isKeyboardVisible执行你的逻辑 }注意:需要处理横竖屏切换的情况,切换时重新记录初始屏幕高度。
结合输入框焦点状态+延迟判断
键盘弹出必然伴随输入框获得焦点,消失则伴随失去焦点。结合焦点状态和延迟检测,规避visible的即时错误值:private bool _isInputFocused; private const float _checkDelay = 0.5f; // 键盘弹出/收起需要一定时间,延迟后判断更准确 private float _lastFocusChangeTime; // 绑定输入框的OnFocus事件 public void OnInputFocused() { _isInputFocused = true; _lastFocusChangeTime = Time.time; } // 绑定输入框的OnEndEdit事件 public void OnInputLostFocus() { _isInputFocused = false; _lastFocusChangeTime = Time.time; } void Update() { bool isKeyboardReallyVisible = false; if (_isInputFocused && Time.time - _lastFocusChangeTime > _checkDelay) { isKeyboardReallyVisible = TouchScreenKeyboard.visible; } else if (!_isInputFocused && Time.time - _lastFocusChangeTime > _checkDelay) { isKeyboardReallyVisible = false; } // 使用isKeyboardReallyVisible做后续逻辑 }监听输入框RectTransform位置变化
若使用UGUI且开启了键盘适配(比如Canvas设置为Screen Space - Overlay),键盘弹出时输入框会被向上推送。可以对比输入框初始Y轴位置与当前位置的差值:public RectTransform inputFieldRect; private float _initialInputY; void Start() { _initialInputY = inputFieldRect.anchoredPosition.y; } void Update() { // 50为阈值,根据你的UI布局调整 bool isKeyboardVisible = inputFieldRect.anchoredPosition.y > _initialInputY + 50; }
额外注意
- iOS和Android的键盘行为存在差异,建议在目标平台上多测试,调整阈值和延迟参数。
- 不要在
Start/Awake中直接判断TouchScreenKeyboard.visible,此时键盘未完成初始化,容易得到错误结果。
内容的提问来源于stack exchange,提问作者Alyra
相关产品推荐
相关产品推荐

