• UIScrollView 滑动复位


    需求

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

    分析

    在制作滑动列表时常常会结合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;
  • 相关阅读:
    对于glut和freeglut的一点比较和在VS2013上的配置问题
    应用程序无法启动(0*c000007b)
    无法定位程序输入点glPopAttrib于动态连结库OPENGL.dll上
    计算机中丢失OPENGL.dll
    Visual Studio "无法查找或打开PDB文件"解决方法
    VC包含目录、附加依赖项、库目录及具体设置
    无法解析的外部符号 _WinMain@16
    OpenGL入门学习
    linux-用户建立及权限分配
    linux下添加用户并赋予root权限
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/4916930.html
Copyright © 2020-2023  润新知