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; 
 | 
    } 
 | 
  
 | 
} 
 |