如果组件实现了ILayoutElement,则自动布局系统会将其视为布局图元。
CalculateLayoutInputHorizontal和CalculateLayoutInputVertical接口,分别负责计算Recttransform的水平和垂直属性,由LayoutRebuilder封装了一层,最终还是通过CanvasUpdateRegistry调用。
另外还定义了一些如minWidth、preferredWidth和flexibleWidth等的布局属性
布局管理的抽象基类
增加了几个布局属性:
padding
在子布局元素周围添加的填充。RectOffset
类型,记录各个方向的间隙数值。childAlignment
用于布局组中子布局元素的对齐方式。TextAnchor
枚举类型,几种锚点配置方式的枚举。LayoutElement Interface,供子类调用,获取所有子节点
List<Component>
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();
}