[Unity学习教程] Unity主动聚焦InputField而且设置光标位置

[复制链接]
查看1291 | 回复0 | 2023-8-23 12:09:37 | 显示全部楼层 |阅读模式 来自 中国北京
媒介

  在一次文本输入的计划中,必要用到点击自定义的Button来删除InputField里对应光标位置的字符,而且保持InputField和光标不会丢失焦点
  

  • 实现删除字符
  

  • 实现InputField焦点不丢失
  

  • 实现光标不消散
  

  • 解决光标重设时,由于主动SelectAll时导致的选中颜色闪烁
  各位有更优的办法可以分享分享 thanks~~
  解决方法

  1. private InputField m_MainIPF;
  2. private int m_CurrentCaretPosition;
  3. private Color m_MainIPF_selectionColor;
  4. private Button m_DelBtn;
  5. Start()
  6. {
  7.     m_MainIPF.onEndEdit.AddListener((value)=> {
  8.                 m_CurrentCaretPosition = m_MainIPF.caretPosition;
  9.             });
  10.    m_DelBtn.onClick.AddListener(OnClickDelBtn);
  11. }
  12. private void OnClickDelBtn()
  13. {
  14.     var value = m_MainIPF.text;
  15.     if (value.Length >= m_CurrentCaretPosition && m_CurrentCaretPosition > 0)
  16.     {
  17.         m_CurrentCaretPosition--;
  18.         value.Remove(m_CurrentCaretPosition, 1);
  19.         m_MainIPF.text = value;
  20.     }
  21.     GameEntry.Instance.StartCoroutine(ResetInputFieldCaret());
  22. }
  23. IEnumerator ResetInputFieldCaret()
  24. {
  25.     if (!m_MainIPF.isFocused)
  26.     {
  27.         m_MainIPF.ActivateInputField();//主动选中输入框,但是会自动执行SelectAll,未知原因
  28.         var color = m_MainIPF_selectionColor;
  29.         color.a = 0;//这里暂时使用的改变颜色来避免SelectAll导致的闪烁
  30.         m_MainIPF.selectionColor = color;
  31.     }
  32.     yield return new WaitForEndOfFrame();//需要延迟一帧后设置光标才会生效
  33.     m_MainIPF.caretPosition = m_CurrentCaretPosition;
  34.     m_MainIPF.ForceLabelUpdate();//立即强制刷新光标显示,否则会在下一帧才生效
  35.     m_MainIPF.selectionColor = m_MainIPF_selectionColor;
  36. }
复制代码
来源:https://blog.csdn.net/smile_otl/article/details/129738746
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则