「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.mzph.cn/diannao/81140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态大语言模型arxiv论文略读(四十七)

AdaShield: Safeguarding Multimodal Large Language Models from Structure-based Attack via Adaptive Shield Prompting ➡️ 论文标题:AdaShield: Safeguarding Multimodal Large Language Models from Structure-based Attack via Adaptive Shield Prompting …

美的人形机器人即将投入实际应用

国内家电巨头美的集团近日公布了其自主研发的人形机器人的具体落地计划。根据公司披露的信息,这款机器人将于5月在湖北荆州的洗衣机工厂率先投入使用,承担设备运维、质量检测和物料搬运等工作任务。预计今年下半年,该机器人还将进入美的线下门…

从零开始搭建你的个人博客:使用 GitHub Pages 免费部署静态网站

🌐 从零开始搭建你的个人博客:使用 GitHub Pages 免费部署静态网站 在互联网时代,拥有一个属于自己的网站不仅是一种展示方式,更是一种技术能力的体现。今天我们将一步步学习如何通过 GitHub Pages 搭建一个免费的个人博客或简历…

canvas动画:点随机运动 距离内自动连接成线 鼠标移动自动吸附附近的点

思路/实现步骤 创建canvas元素 获取canvas的上下文ctx 初始化点的信息(数量、初始坐标、移动方向、移动速度、大小、颜色) 绘制点 绘制点之间的连线 点有规律的动起来 动画循环 鼠标移动相关逻辑 点鼠标之间连线 鼠标吸附逻辑 添加配置项 重绘…

2025年4月AI科技领域周报(4.21-4.27):大模型生态加速演进 通用AI开启产业融合新范式

2025年4月AI科技领域周报(4.21-4.27):大模型生态加速演进 通用AI开启产业融合新范式 一、本周热点回顾1. OpenAI发布全球首款通用AI芯片「GPT-NPU」 重塑AI算力架构2. 谷歌DeepMind发布医疗AI系统「Med-Pathfinder」 实现全科室智能诊断3. 微…

【Bash】可以请您解释性地说明一下“2>1”这个语法吗?

Qwen3-235B 当然可以!我们一步步拆解 2>&1 的含义,用生活化的例子来理解它: 🧠 前提知识:三个“水流通道” 在 Linux/Unix 系统中,程序运行时有三种默认的“水流通道”: 标准输入&…

MAC如何安装多版本jdk(以8,11,17为例)

MAC如何安装多版本jdk(以8,11,17为例)_mac安装jdk17-CSDN博客

Nginx核心

一、概述 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个电子邮件代理服务器。正向代理服务的是客户端(比如VPN),反向代理服务的是服务端。Nginx是多进程的,有一个Master进程控制多个Worke…

综合开发-手机APP远程控制PLC1500柱灯的亮灭

要通过 ​​Unity3D​​ 开发的手机 App 控制 ​​电气柜上面的柱灯,需要WIFI模块作为桥梁,按照以下步骤实现: ​​1. 硬件准备(硬件部分)​​ ​​所需材料​​ ​​ESP32开发板​​(如ESP32-WROOM-32&a…

五款提效工具

1. 亿可达 核心功能:通过“触发器动作”模式,实现任务自动执行(如邮件转发、评论回复、数据同步)。 适用场景:自动同步Notion项目到滴答清单生成待办事项 优势:节省重复操作时间,减少人为错误&a…

Docker化HBase排错实录:从Master hflush启动失败到Snappy算法未支持解决

前言 在容器化时代,使用 Docker 部署像 HBase 这样复杂的分布式系统也比较方便。社区也提供了许多方便的 HBase Docker 镜像,没有找到官方的 apache的,但有包含许多大数据工具的 harisekhon/hbase 或用于学习目的的 bigdatauniversity/hbase…

windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)

服务器数据库的搭建和远程访问 mysql数据库安装(详细) window安装mysql详细流程 路程:重设MySQL5密码,发现远程服务器原本有一个MySQL5,尝试在服务器本地建立连接被拒绝,因为不知道密码。 (1…

每日c/c++题 备战蓝桥杯(P1093 [NOIP 2007 普及组] 奖学金)

洛谷P1093 [NOIP 2007 普及组] 奖学金 详解题解 题目背景与要求 题目链接:P1093 奖学金 核心任务:根据学生三科总分评选前5名奖学金获得者,需按特定规则排序输出。 排序规则(按优先级从高到低): 总分降…

openEuler 22.03 安装 Nginx,支持离线安装

目录 一、环境检查1.1 必要环境检查1.2 在线安装(有网络)1.3 离线安装(无网络) 二、下载Nginx2.1 在线下载2.2 离线下载 三、安装Nginx四、开机自启服务五、开放防火墙端口六、常用命令 一、环境检查 1.1 必要环境检查 # 查看 g…

基于深度学习的图像压缩技术(二)

接上篇:基于深度学习的图像压缩技术(一)-CSDN博客 3 基于生成对抗神经网络的图像压缩技术 生成对抗网络是一种先进的无监督学习算法,由Goodfellow等人在2014 年首次提出,其核心思想源于博弈论。 生成对抗网络在图像压…

TCP和UDP的数据传输+区别

目录 一、数据传输过程 1.1 TCP字节流服务图 1.2 UDP数据报服务图 二、tcp与udp的区别 1.连接方式 2.可靠性 3.传输效率 4.有序性 5.流量控制和拥塞控制 6.应用场景 7.首部长度 三、tcp与udp能不能使用同一个端口号? 四、同一个协议&#xf…

基于ssm的校园旧书交易交换平台(源码+文档)

项目简介 校园旧书交易交换平台的主要使用者分为: 前台功能:用户进入系统可以对首页、书籍信息、校园公告、个人中心、后台管理等功能进行操作; 后台主要是管理员,管理员功能包括主页、个人中心、学生管理、发布人管理、书籍分类…

虚假安全补丁攻击WooCommerce管理员以劫持网站

一场大规模钓鱼攻击正针对WooCommerce用户,通过伪造安全警报诱使他们下载所谓的"关键补丁",实则为植入WordPress后门的恶意程序。 恶意插件植入 根据Patchstack研究人员发现,上当受骗的用户在下载更新时,实际上安装的…

《冰雪传奇点卡版》:第二大陆介绍!

一、第二大陆:高阶资源与实力验证的核心战场 1. 准入条件与地图分布 进入门槛: 基础要求:角色需达到四转(需消耗50万元宝完成转生任务),部分地图需额外满足神魔点数(如黑暗之森需神魔全2&#…

信创系统图形界面开发指南:技术选择与实践详解

信创系统图形界面开发指南:技术选择与实践详解 🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书&…