public void ApplyRectTransform(ViewElementTransform viewElementTransform, RectTransformFlag?overrideFlag = null)
        {
            var currentFlag = overrideFlag.HasValue ? overrideFlag.Value : viewElementTransform.rectTransformFlag;

            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.SizeDelta))
            {
                rectTransform.sizeDelta = viewElementTransform.rectTransformData.sizeDelta;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchoredPosition))
            {
                rectTransform.anchoredPosition3D = viewElementTransform.rectTransformData.anchoredPosition;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchorMax))
            {
                rectTransform.anchorMax = viewElementTransform.rectTransformData.anchorMax;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.AnchorMin))
            {
                rectTransform.anchorMin = viewElementTransform.rectTransformData.anchorMin;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.LocalEulerAngles))
            {
                rectTransform.localEulerAngles = viewElementTransform.rectTransformData.localEulerAngles;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.LocalScale))
            {
                rectTransform.localScale = viewElementTransform.rectTransformData.localScale;
            }
            if (FlagsHelper.IsSet(currentFlag, RectTransformFlag.Pivot))
            {
                rectTransform.pivot = viewElementTransform.rectTransformData.pivot;
            }
        }
        public IEnumerator OnChangePageRunner(bool show, Transform parent, ViewElementTransform rectTransformData, float TweenTime, float delayIn, bool ignoreTransition, bool reshowIfSamePage)
        {
            if (lifeCyclesObjects != null)
            {
                foreach (var item in lifeCyclesObjects.ToArray())
                {
                    try
                    {
                        item.OnChangePage(show);
                    }
                    catch (Exception ex) { ViewSystemLog.LogError(ex.ToString(), this); }
                }
            }
            if (show)
            {
                if (parent == null)
                {
                    ViewSystemLog.LogError($"{gameObject.name} does not set the parent for next viewpage.", this);
                    goto END;
                    //throw new NullReferenceException(gameObject.name + " does not set the parent for next viewpage.");
                }
                //停掉正在播放的 Leave 動畫
                if (leaveCoroutine != null)
                {
                    // viewController.StopCoroutine(OnLeaveCoroutine);
                }
                //還在池子裡,應該先 OnShow
                //或是正在離開,都要重播 OnShow
                if (IsShowed == false || OnLeaveWorking)
                {
                    rectTransform.SetParent(parent, true);

                    if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath))
                    {
                        rectTransform.anchoredPosition3D = Vector3.zero;
                        rectTransform.localScale         = Vector3.one;
                    }
                    else
                    {
                        ApplyRectTransform(rectTransformData);
                    }

                    float time = 0;
                    while (time < delayIn)
                    {
                        time += GlobalTimer.deltaTime;
                        yield return(null);
                    }
                    OnShow();
                    goto END;
                }
                //已經在場上的
                else
                {
                    //如果目前的 parent 跟目標的 parent 是同一個人 那就什麼事都不錯
                    if ((rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath)) && parent.GetInstanceID() == rectTransform.parent.GetInstanceID())
                    {
                        //ViewSystemLog.LogWarning("Due to already set the same parent with target parent, ignore " +  name);
                        if (reshowIfSamePage)
                        {
                            OnShow();
                        }
                        goto END;
                    }
                    //其他的情況下用 Tween 過去
                    if (TweenTime >= 0)
                    {
                        rectTransform.SetParent(parent, true);
                        if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath))
                        {
                            var marginFixer = GetComponent <ViewMarginFixer>();
                            viewController.StartMicroCoroutine(EaseUtility.To(
                                                                   rectTransform.anchoredPosition3D,
                                                                   Vector3.zero,
                                                                   TweenTime,
                                                                   EaseStyle.QuadEaseOut,
                                                                   (v) =>
                            {
                                rectTransform.anchoredPosition3D = v;
                            },
                                                                   () =>
                            {
                                if (marginFixer)
                                {
                                    marginFixer.ApplyModifyValue();
                                }
                            }
                                                                   ));

                            viewController.StartMicroCoroutine(EaseUtility.To(
                                                                   rectTransform.localScale,
                                                                   Vector3.one,
                                                                   TweenTime,
                                                                   EaseStyle.QuadEaseOut,
                                                                   (v) =>
                            {
                                rectTransform.localScale = v;
                            }
                                                                   ));
                        }
                        else
                        {
                            rectTransform.SetParent(parent, true);
                            var flag = rectTransformData.rectTransformFlag;
                            FlagsHelper.Unset(ref flag, RectTransformFlag.AnchoredPosition);
                            FlagsHelper.Unset(ref flag, RectTransformFlag.LocalScale);

                            ApplyRectTransform(rectTransformData, flag);

                            viewController.StartMicroCoroutine(EaseUtility.To(
                                                                   rectTransform.anchoredPosition3D,
                                                                   rectTransformData.rectTransformData.anchoredPosition,
                                                                   TweenTime,
                                                                   EaseStyle.QuadEaseOut,
                                                                   (v) =>
                            {
                                rectTransform.anchoredPosition3D = v;
                            },
                                                                   () =>
                            {
                            }
                                                                   ));
                            viewController.StartMicroCoroutine(EaseUtility.To(
                                                                   rectTransform.localScale,
                                                                   rectTransformData.rectTransformData.localScale,
                                                                   TweenTime,
                                                                   EaseStyle.QuadEaseOut,
                                                                   (v) =>
                            {
                                rectTransform.localScale = v;
                            },
                                                                   () =>
                            {
                            }
                                                                   ));
                        }

                        goto END;
                    }
                    //TweenTime 設定為 <0 的情況下,代表要完整 OnLeave 在 OnShow
                    else
                    {
                        float time = 0;
                        while (time < delayIn)
                        {
                            time += GlobalTimer.deltaTime;
                            yield return(null);
                        }
                        OnLeave(ignoreTransition: ignoreTransition);
                        while (OnLeaveWorking == true)
                        {
                            yield return(null);
                        }
                        ViewSystemLog.LogWarning("Try to ReShow ", this);
                        rectTransform.SetParent(parent, true);
                        if (rectTransformData == null || !string.IsNullOrEmpty(rectTransformData.parentPath))
                        {
                            rectTransform.anchoredPosition3D = Vector3.zero;
                            rectTransform.localScale         = Vector3.one;
                        }
                        else
                        {
                            ApplyRectTransform(rectTransformData);
                        }
                        time = 0;
                        while (time < delayIn)
                        {
                            time += GlobalTimer.deltaTime;
                            yield return(null);
                        }
                        OnShow();
                        goto END;
                    }
                }
            }
            else
            {
                OnLeave(ignoreTransition: ignoreTransition);
                goto END;
            }

END:
            changePageCoroutine = null;
            yield break;
        }
 public virtual void ChangePage(bool show, Transform parent, ViewElementTransform rectTransformData, int sortingOrder = 0, float TweenTime = 0, float delayIn = 0, bool ignoreTransition = false, bool reshowIfSamePage = false)
 {
     this.sortingOrder = sortingOrder;
     NormalizeViewElement();
     changePageCoroutine = viewController.StartMicroCoroutine(OnChangePageRunner(show, parent, rectTransformData, TweenTime, delayIn, ignoreTransition, reshowIfSamePage));
 }