当前位置: 首页 > web >正文

「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩

先看实现效果:

要实现这个效果,有三个方面的问题需要解决:

第一,输入框的高度扩展,内部子元素会随着锚点,拉伸变形——要解决这个问题,需要将内部元素改变父类,然后增加父类高度,再恢复父类,这样内部元素(如图中两个按钮),就不会随着高度增加,而拉伸变形。类似代码如下:

private void ChangeInputHeight(float heightChange)
{// disable the effect of parent size changes on child layoutsthis.finishRecordRT.SetParent(null);this.recordRT      .SetParent(null);if (heightChange != 0.0f){this.inputFieldRT.SetRelativeSizeY(heightChange);this.inputBarHeightChange += heightChange;}else {this.inputFieldRT.SetRelativeSizeY(-this.inputBarHeightChange);this.inputBarHeightChange = 0.0f;}this.finishRecordRT.SetParent(this.inputBarRT);this.recordRT      .SetParent(this.inputBarRT);
}

第二,注册inputField.onValueChanged去监听,输入框的文本变化,并通过inputField.textComponent.textInfo的行变化,去判断换行发生。

private void OnInputFieldValueChanged(string text)
{var textInfo  = this.inputField.textComponent.textInfo;var lineCount = textInfo.lineCount;if (this.inputFieldPreTextLineCount != lineCount){this.ChangeInputHeight(this.inputFieldLineHeight * (lineCount - this.inputFieldPreTextLineCount));this.inputFieldPreTextLineCount = lineCount;}
}

这里需要记录之前的行数,即inputFieldPreTextLineCount,然后对比变化后的行数,就可以知道是否换行,以及换了几行。

第三,InputField换行后(输入换行符),无法直接触发行数变化,需要输入一个字符后才行,所以需要自行判断,键入了换行符。但删除换行符后,就会触发行数变化,这个删除逻辑就是需要的。

    if (this.inputFieldPreTextLineCount != lineCount){this.ChangeInputHeight(this.inputFieldLineHeight * (lineCount - this.inputFieldPreTextLineCount));this.inputFieldPreTextLineCount = lineCount;}else{// inputField.text equal to text, not equal to inputField.textComponent.text (textInfo)// when adds    chars, the textInfo.characterCount equal to the text.Length// when removes chars, the textInfo.characterCount is more than text.Length (because adds extra space \u200B)if (textInfo.characterCount == text.Length && text[^1] == '\n'){this.ChangeInputHeight(this.inputFieldLineHeight);++this.inputFieldPreTextLineCount;}}

这里增加的逻辑就是:当行数没变的时候,需要检测text的最后一个字符,是否是换行符——如果是,就增加高度,而删除则可以通过行数变化处理,包括一次删除多行。

为什么要加一个textInfo.characterCount == text.Length的判断?

因为,只有在输入字符的时候,才会成立——而删除字符的时候不成立,这样就会剔除,删除换行符是最后一个,但还没删除它,此时行数也没变化。

而之所以,删除字符的时候不成立——是因为,在删除字符的时候,InputField的代码显示,会增加看不见的标识字符,即\u200B——因此,inputField.textComponent.text(textInfo)text(inputField.text)的内容会不一致。  

http://www.xdnf.cn/news/3117.html

相关文章:

  • AI技术在当代互联网行业的崛起与重要性!
  • MCP 服务器搭建【stdio 类型】实现上市公司年报查询总结,配合 Cherry Studio使用简单
  • Copilot for Excel 一键词云分析与情绪分析
  • 数据仓库与数据湖的对比分析
  • 计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的模糊车牌图像清晰化复原算法设计与实现(含Github代码+Web端在线体验链接)
  • 第三方软件测试报告如何凭借独立公正与专业权威发挥关键作用?
  • 传输线的反射:
  • MS2111多点低压差分(M-LVDS)线路驱动器和接收器
  • 第13讲:图形尺寸与分辨率设置——适配论文版面,打造专业图稿!
  • AI正当时,国内AI HR领先厂商易路如何从“单点突破”到“全面融合”
  • The Open Group 参加雷丁博物馆的数字革命展览
  • JSON配置文件格式全解析与多语言实战指南
  • 软考高项(信息系统项目管理师)第 4 版全章节核心考点解析(第4版课程精华版)
  • 《冰雪传奇点卡版》:探索冰雪世界的传奇旅程!
  • 2025年KBS新算法 SCI1区TOP:长颖燕麦优化算法AOO,深度解析+性能实测
  • 虚假安全补丁攻击WooCommerce管理员以劫持网站
  • 混淆矩阵(Confusion Matrix)横坐标
  • 瑞幸咖啡披露2025年Q1财报:门店净增1757家,营业利润率达8.3%
  • 【网络编程】socket编程和TCP协议
  • 数据安全第一步:常用Linux备份与压缩命令保驾护航
  • IP地址、子网掩码与默认网关详解
  • MySQL基础关键_001_认识
  • 高德地图线上截图瓦片地图加载不完全
  • 数据中心电能质量问题解决方案及经典案例
  • 人工智能在医疗行业的应用和发展前景
  • 首版次误区有哪些?与软件测试报告又有什么联系?
  • C++中一些关于何时何处定义类或函数的问题
  • MyBatis、MyBatis-Plus、Hibernate、Spring Data JPA 等 Java 持久层技术的理解和对比
  • C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)
  • 局域网视频会议软件BeeWorks Meet