private void HandleSelfFittingAndChildrenSizeAlongAxis(int axis)
        {
            FitMode fitting = (axis == 0 ? horizontalFit : verticalFit);

            if (fitting != FitMode.Unconstrained)
            {
                m_Tracker.Add(this, rectTransform,
                              (axis == 0 ? DrivenTransformProperties.SizeDeltaX : DrivenTransformProperties.SizeDeltaY));
                rectTransform.SetSizeWithCurrentAnchors((RectTransform.Axis)axis, GetTotalPreferredSize(axis));
            }

            SelfSizeRatioMode sizeRatioMode = (axis == 0 ? selfSizeWidthRatio : selfSizeHeightRatio);

            if (sizeRatioMode != SelfSizeRatioMode.Unconstrained)
            {
                bool needRebuild = false;

                if (sizeRatioMode == SelfSizeRatioMode.RelativeParent && rectTransform.parent != null &&
                    rectTransform.parent is RectTransform)
                {
                    //如果是限制在父对象内部,则限制的区域为
                    //父对象的宽和高减去limitPadding的水平和竖直间隔范围内
                    float preferred = LayoutUtility.GetPreferredSize(rectTransform.parent as RectTransform, axis) - (axis == 0 ? limitPadding.horizontal : limitPadding.vertical);
                    preferred = Mathf.Max(0, preferred);
                    preferred = axis == 0
                        ? Mathf.Clamp(GetTotalPreferredSize(axis), m_MinWidthRatio * preferred, m_MaxWidthRatio * preferred)
                        : Mathf.Clamp(GetTotalPreferredSize(axis), m_MinHeightRatio * preferred, m_MaxHeightRatio * preferred);

                    m_Tracker.Add(this, rectTransform,
                                  (axis == 0 ? DrivenTransformProperties.SizeDeltaX : DrivenTransformProperties.SizeDeltaY));

                    needRebuild = axis == 1 && (m_NeedRebuildCurrentFrame != Time.frameCount) && !Mathf.Approximately(preferred, GetTotalPreferredSize(1));

                    rectTransform.SetSizeWithCurrentAnchors((RectTransform.Axis)axis, preferred);
                    SetLayoutInputForAxis(preferred, preferred, -1, axis);
                }
                else if (sizeRatioMode == SelfSizeRatioMode.FixedSize)
                {
                    float preferred = (axis == 0 ? fixedSize.x: fixedSize.y) - (axis == 0 ? limitPadding.horizontal : limitPadding.vertical);
                    preferred = axis == 0
                                ? Mathf.Clamp(GetTotalPreferredSize(axis), m_MinWidthRatio * preferred, m_MaxWidthRatio * preferred)
                                : Mathf.Clamp(GetTotalPreferredSize(axis), m_MinHeightRatio * preferred, m_MaxHeightRatio * preferred);

                    m_Tracker.Add(this, rectTransform,
                                  (axis == 0 ? DrivenTransformProperties.SizeDeltaX : DrivenTransformProperties.SizeDeltaY));

                    needRebuild = axis == 1 && (m_NeedRebuildCurrentFrame != Time.frameCount) && !Mathf.Approximately(preferred, GetTotalPreferredSize(1));

                    rectTransform.SetSizeWithCurrentAnchors((RectTransform.Axis)axis, preferred);
                    SetLayoutInputForAxis(preferred, preferred, -1, axis);
                }

                if (needRebuild)
                {
                    //高度约束导致高度变化的情况下,需要重新计算布局,因为可能宽度也变了,但是宽度是提前算的,不重新算,会导致得到错误的值
                    m_NeedRebuildCurrentFrame = Time.frameCount;
                    LayoutRebuilderUtility.MarkLayoutForImmediateRebuild(rectTransform);
                    return;
                }
            }
        }