UIPanelResetHelper(UIScrollView滚动复位)

时间:2022-02-14 17:58:46

原理

如果我们的UI中有滑动列表,并且列表比较长,那么不知道你们是否有这样需求,每次页面打开时,列表的滑动状态都恢复到默认状态。

如果要复位,其实就是修改UIPanel 的属性到初始状态。此组件做的工作就是在初始化时把UIPanel的属性保存起来,在需要时还原初始值,达到复位效果。

 

组件代码

using UnityEngine;
using System.Collections.Generic;

/// <summary>
/// 方便对UIPanel进行滚动复位
/// 用法: 
///     var panelResetHelper = UIPanelResetHelper.Create(m_uiPanel);
///     页面重新打开时调用:panelResetHelper.ResetScroll();
/// by 赵青青
/// </summary>
public class UIPanelResetHelper
{
    public UIPanel m_panel { get; private set; }
    public Vector2 m_initPanelClipOffset { get; private set; }
    public Vector3 m_initPanelLocalPos { get; private set; }

    public UIPanelResetHelper(UIPanel uiPanel)
    {
        if (uiPanel == null)
        {
            Debug.LogWarning("需要UIPanel,却传入了NULL,请检查");
            return;
        }
        m_panel = uiPanel;
        m_initPanelClipOffset = m_panel.clipOffset;
        m_initPanelLocalPos = m_panel.cachedTransform.localPosition;
    }

    public void ResetScroll()
    {
        if (m_panel == null) return;
        m_panel.clipOffset = m_initPanelClipOffset;
        m_panel.cachedTransform.localPosition = m_initPanelLocalPos;
    }

    public static UIPanelResetHelper Create(Transform uiPanelTrans)
    {
        UIPanel uiPanel = uiPanelTrans.GetComponent<UIPanel>();
        return Create(uiPanel);
    }

    public static UIPanelResetHelper Create(UIPanel uiPanel)
    {
        return new UIPanelResetHelper(uiPanel);
    }
}

 

使用方法

在打开页面时,调用resetscroll。

using UnityEngine;
using System.Collections;

public class UIPayList : MonoBehaviour
{
    public Transform m_ListPanel;
    private UIPanelResetHelper m_PanelResetHelper;

    public void BindContrller()
    {
        //TODO 其它的绑定代码
        if (m_ListPanel)
        {
            m_PanelResetHelper = UIPanelResetHelper.Create(m_ListPanel);
        }
    }

    public void OnOpen()
    {
        //打开时,对列表进行复位
        ResetScroll();
    }

    public void ResetScroll()
    {
        //NOTE 重设Scrollview的位置
        if (m_PanelResetHelper != null) m_PanelResetHelper.ResetScroll();
    }
}