| using Cysharp.Threading.Tasks; | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
|   | 
| //控制目标的最大最小尺寸 | 
| [ExecuteAlways] | 
| public class LayoutElementSizeClamp : LayoutElement | 
| { | 
|     [SerializeField] bool m_ClampEnable; | 
|     public bool clampEnable { get { return m_ClampEnable; } set { m_ClampEnable = value; } } | 
|   | 
|     [SerializeField] Clamp m_Clamp; | 
|     public Clamp clamp { get { return m_Clamp; } } | 
|   | 
|     [SerializeField] RectTransform m_Target; | 
|   | 
|   | 
|     protected override void OnEnable() | 
|     { | 
|         base.OnEnable(); | 
|         if (clampEnable && m_Target != null) | 
|         { | 
|             UpdateRect().Forget(); | 
|         } | 
|   | 
|     } | 
|   | 
|     async UniTask UpdateRect() | 
|     { | 
|         await UniTask.DelayFrame(1); | 
|         preferredHeight = -1; | 
|         preferredWidth = -1; | 
|         //频繁调用ForceRebuildLayoutImmediate的原因是 | 
|         // 如Text要自适应宽高又要限制宽高, 先要处理宽度刷新后才能计算换行 | 
|         // 强制重新计算布局 | 
|         LayoutRebuilder.ForceRebuildLayoutImmediate(transform.parent as RectTransform); | 
|         preferredWidth = Mathf.Clamp(m_Target.rect.width, m_Clamp.minX, m_Clamp.maxX); | 
|         // 强制重新计算布局 | 
|         LayoutRebuilder.ForceRebuildLayoutImmediate(transform.parent as RectTransform); | 
|         preferredHeight = Mathf.Clamp(m_Target.rect.height, m_Clamp.minY, m_Clamp.maxY); | 
|   | 
|     } | 
|   | 
|   | 
|     [System.Serializable] | 
|     public struct Clamp | 
|     { | 
|         public float minX; | 
|         public float maxX; | 
|         public float minY; | 
|         public float maxY; | 
|     } | 
|   | 
| } |