「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.pswp.cn/diannao/81140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81140.shtml
英文地址,請注明出處:http://en.pswp.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等多種編程語言開發經驗,擁有高級工程師證書&…