「Unity3D」TextMeshPro的TMP_InputField在改变高度时,其中textComponent移动的问题解决
如图所示, 在多行模式下,换行会推动textComponent的区域移动,这是无法通过代码(AnchorPositionY)调整的,因为TMP_InputField内部更新,会自动调整这个位移。
第一,多行文本的增与删。
但这就会产生一个问题,如粘贴多行或删除多行时,就会导致textComponent的位移——此时,如果没有触发滚动条,就只能使用键盘上下移动来调整,在触摸屏则没有办法调整。
要解决这个问题,可以调用TMP_InputField的一个函数,即public void ProcessEvent(Event e),然后传入KeyCode.PageDown事件,就可以触发一个内置函数private void MovePageDown(bool shift),来直接滚动textComponent到底部。
this.ProcessEvent(Event.KeyboardEvent("page down"));
第二,动画增加输入高度。
另一种情况,如果使用Tween动画,来动态调整TMP_InputField的高度,即:在OnValueChanged中监测到换行时,动画增加高度。
但动画是一个过程,而OnValueChanged立即返回后,由于文本高度增加,TMP_InputField还没来得及增加,结果就会产生textComponent的位移,导致文本上移不可见。
要解决这个问题,就要既保留动画,也同时增加TMP_InputField高度,使得textComponent不触发移动。
方法就是,增加InputFieldPlus高度,但将TextArea其下移,并同步InputBar(输入区域整体)高度与TextArea上移的动画。
如图所示:
- 在OnValueChanged中,增加InputFieldPlus的高度,这样textComponent就不会出现移动。
- 将TextArea下移,抵消InputFieldPlus的高度变化。
- 在InputBar高度增加动画开启时,同步TextArea上移动画开启,这样视觉上,就是InputBar(输入区域)与其中的文本,一起动画扩展。