UIScrollView 滑动复位

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/4916930.html



需求#

在每次打开界面滑动列表都是复位状态(未滑动)。

分析#

在制作滑动列表时常常会结合UIPanel和UIScrollView

要让滑动列表回到未滑动时的位置,那么就需要改变Panel的Clipping和transform的position

演示#

scrollview_1

 

以前做法#

以前是保存Panel的初始信息,每时打开面板时再还原

复制代码
public class CUIShopVIP : CUIController
{
    private UIPanel GridPanel;
    private UIScrollView GridPanel_ScrollView;
    private float BakGridPanel_Y;
    private Vector4 BakGridPanel_ClipRegion;

    public override void OnInit()
    {
        base.OnInit();
        //...... 初始化代码

        GridPanel = GetControl<UIPanel>("GridPanel");
        GridPanel_ScrollView = GridPanel.GetComponent<UIScrollView>();

        BakGridPanel_Y = GridPanel.transform.GetLocalPositionY();
        BakGridPanel_ClipRegion = GridPanel.baseClipRegion;
    } 
    
    public override void OnOpen(params object[] args)
    {
        base.OnOpen(args);

        //打开前 重设Scrollview的属性到初始

        GridPanel.baseClipRegion = BakGridPanel_ClipRegion;//NOTE 不建议直接修改此值
        GridPanel_ScrollView.UpdatePosition();
        GridPanel_ScrollView.ResetPosition();
        GridPanel.transform.SetLocalPositionY(BakGridPanel_Y);   
    }
}
复制代码

之前的做法是 修改 Panel的 localPosition 和 Panel的 baseClipRegion,但官方不建议直接修改baseClipRegion。然后更新ScrollView的信息

/// <summary>
/// Clipping position (XY) and size (ZW).
/// Note that you should not be modifying this property at run-time to reposition the clipping. Adjust clipOffset instead.
/// </summary>

public Vector4 baseClipRegion

 

编写组件#

现在做了一个PanelResetHelper,修改Panel的 clipOffsetlocalPosition 而不直接修改baseClipRegion

/// <summary>
/// Clipping area offset used to make it possible to move clipped panels (scroll views) efficiently.
/// Scroll views move by adjusting the clip offset by one value, and the transform position by the inverse.
/// This makes it possible to not have to rebuild the geometry, greatly improving performance.
/// </summary>

public Vector2 clipOffset

原理#

和之前做法一样,初始化时保存Panel的属性,界面打开时,再还原值。

组件源码#

Helper代码如下

复制代码
/// <summary>
/// 可以对UIPanel进行滚动复位
/// </summary>
public class CUIPanelResetHelper
{
    private UIPanel _panel;
    private Vector2 _initPanelClipOffset;
    private Vector3 _initPanelLocalPos;

    public CUIPanelResetHelper(UIPanel uiPanel)
    {
        _panel = uiPanel;
        _initPanelClipOffset = _panel.clipOffset;
        _initPanelLocalPos = _panel.cachedTransform.localPosition;
    }

    public void ResetScroll()
    {
        _panel.clipOffset = _initPanelClipOffset;
        _panel.cachedTransform.localPosition = _initPanelLocalPos;
    }
}
复制代码

组件用法#

复制代码
public class CUIShopVIP : CUIController
{
    private UIPanel GridPanel;
    private CUIPanelResetHelper GridPanelResetHelper;

    public override void OnInit()
    {
        base.OnInit();
        //...... 初始化代码
        GridPanel = GetControl<UIPanel>("GridPanel");
        GridPanelResetHelper = new CUIPanelResetHelper(GridPanel);
    }

    public override void OnOpen(params object[] args)
    {
        base.OnOpen(args);
        
        //打开前 重设Scrollview的属性到初始
        GridPanelResetHelper.ResetScroll();
    }
}
复制代码

UIScrollView#

uiscrollview中的属性

复制代码
/// <summary>
/// Whether the dragging will be restricted to be within the scroll view's bounds.
/// </summary>
public bool restrictWithinPanel = true;

/// <summary>
/// Whether dragging will be disabled if the contents fit.
/// </summary>
public bool disableDragIfFits = false;
复制代码
作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(2874)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
CONTENTS
点击右上角即可分享
微信分享提示