1、实现动态高度尺寸的的InputField


通过这两个部件就可以实现inputField的动态改变尺寸。

将inputField放入到scrollview当中作为子类
将scrollview 链接到UIChatInputField脚本中。
2、实现UIChatInputField
//聊天输入框(类似wechat)
[RequireComponent(typeof(InputField))]
public class UIChatInputField : MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler
{
[Header("尺寸设置")]
public float maxHeight = 500; // 最大可见高度
public float padding = 10f; // 文本边距
public float sensitivity = 1f;// 滚动灵敏度
public float elasticStrength = 0.2f; // 边界弹性强度
public ScrollRect ScrollRect;
private RectTransform scrollRectCotent;
private RectTransform inputRect;
private ContentSizeFitter contentSizeFitter;
private InputField inputField;
private Vector2 startPos;
private bool isDragging;
public void Awake()
{
inputField = GetComponent<InputField>();
inputField.onValueChanged.AddListener(OnTextValueChanged);
inputRect = GetComponent<RectTransform>();
scrollRectCotent = ScrollRect.content;
contentSizeFitter = GetComponent<ContentSizeFitter>();
}
Vector2 normalizedPos = new Vector2(0, 0);
void OnTextValueChanged(string str)
{
contentSizeFitter.SetLayoutVertical();
Vector2 sizeDelta = inputRect.sizeDelta;
ScrollRect.content.sizeDelta = sizeDelta;
if (inputRect.sizeDelta.y >= maxHeight)
{
sizeDelta.y = maxHeight;
}
RectTransform rectsCroll = ScrollRect.GetComponent<RectTransform>();
rectsCroll.sizeDelta = sizeDelta;
ScrollRect.normalizedPosition = normalizedPos;
}
private float GetScrollRange()
{
return Mathf.Max(0, scrollRectCotent.rect.height - ScrollRect.viewport.rect.height);
}
//坐标转换
public Vector2 ConvertScreenPosition(Vector2 screenPos)
{
Vector2 localPos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(ScrollRect.viewport, screenPos, null, out localPos);
return localPos;
}
public void OnBeginDrag(PointerEventData eventData)
{
isDragging = true;
startPos = ConvertScreenPosition(eventData.position);
ScrollRect.StopMovement();
}
public void OnDrag(PointerEventData eventData)
{
if (!isDragging)
return;
Vector2 currentPos = ConvertScreenPosition(eventData.position);
Vector2 delta = (currentPos - startPos)*sensitivity;
startPos = currentPos;
// 转换为标准化位置
float newNormalizedPos = ScrollRect.verticalNormalizedPosition + delta.y / GetScrollRange();
newNormalizedPos = Mathf.Clamp01(newNormalizedPos); // 基础限制
// 应用弹性边界
if (newNormalizedPos < 0 || newNormalizedPos > 1)
{
newNormalizedPos += (newNormalizedPos > 1 ? -1 : 1) * elasticStrength;
}
// 更新滚动位置
ScrollRect.verticalNormalizedPosition = newNormalizedPos;
}
public void OnEndDrag(PointerEventData eventData)
{
isDragging = false;
}
}
效果如:
