UIScrollView 滑动复位
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/4916930.html
需求#
在每次打开界面滑动列表都是复位状态(未滑动)。
分析#
在制作滑动列表时常常会结合UIPanel和UIScrollView
要让滑动列表回到未滑动时的位置,那么就需要改变Panel的Clipping和transform的position
演示#
以前做法#
以前是保存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的 clipOffset和 localPosition 而不直接修改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;
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验