结构

ILayoutElement

如果组件实现了ILayoutElement,则自动布局系统会将其视为布局图元。

CalculateLayoutInputHorizontal和CalculateLayoutInputVertical接口,分别负责计算Recttransform的水平和垂直属性,由LayoutRebuilder封装了一层,最终还是通过CanvasUpdateRegistry调用。

另外还定义了一些如minWidth、preferredWidth和flexibleWidth等的布局属性

LayoutGroup

布局管理的抽象基类

增加了几个布局属性:

CalculateLayoutInputHorizontal

LayoutElement Interface,供子类调用,获取所有子节点

  1. 使用对象池缓存List<Component>
  2. 获取所有符合ILayoutIgnorer条件的子节点
  3. 将子节点加入m_RectChildren
 public virtual void CalculateLayoutInputHorizontal()
 {
     m_RectChildren.Clear();
     var toIgnoreList = ListPool<Component>.Get();
     for (int i = 0; i < rectTransform.childCount; i++)
     {
         var rect = rectTransform.GetChild(i) as RectTransform;
         if (rect == null || !rect.gameObject.activeInHierarchy)
             continue;

         rect.GetComponents(typeof(ILayoutIgnorer), toIgnoreList);

         if (toIgnoreList.Count == 0)
         {
             m_RectChildren.Add(rect);
             continue;
         }

         for (int j = 0; j < toIgnoreList.Count; j++)
         {
             var ignorer = (ILayoutIgnorer)toIgnoreList[j];
             if (!ignorer.ignoreLayout)
             {
                 m_RectChildren.Add(rect);
                 break;
             }
         }
     }
     ListPool<Component>.Release(toIgnoreList);
     m_Tracker.Clear();
 }

SetDirty