需求

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

分析

在制作滑动列表时常常会结合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的 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;

UIScrollView 滑动复位的更多相关文章

  1. 固定UIScrollView滑动的方向

    固定UIScrollView滑动的方向 一般而言,我们通过这两个参数CGRectMake以及contentSize就可以自动的让UIScrollView只往一个方向滚动.但我遇到过非常奇葩的情况,那就 ...

  2. UIPanelResetHelper(UIScrollView滚动复位)

    原理 如果我们的UI中有滑动列表,并且列表比较长,那么不知道你们是否有这样需求,每次页面打开时,列表的滑动状态都恢复到默认状态. 如果要复位,其实就是修改UIPanel 的属性到初始状态.此组件做的工 ...

  3. UIScrollView 滑动试图

    UIScrollView --->UIView //创建UIScrollView testScrollView=[[UIScrollView alloc]init]; testScrollVie ...

  4. iOS中如何使定时器NSTimer不受UIScrollView滑动所影响

    以下是使用 scheduledTimerWithTimeInterval 方法来实现定时器 - (void)addTimer { NSTimer scheduledTimerWithTimeInter ...

  5. IOS开发之--UIScrollView pagingEnabled自定义翻页宽度

    用到UIScrollview的翻页效果时,有时需要显示一部分左右的内容,但是UIScrollView的PagingEnabled只能翻过整页,下面几个简单的设置即可实现 技术点: 1. 创建一个继承U ...

  6. IOS开发之UIScrollVIew运用

    UIScrollView可以实现在一个界面看到所有内容,同时也不需要担心所显示的内容超出屏幕的大小,当超出之后可以翻阅至下一页浏览. #pragma mark - UIScrollViewDelega ...

  7. 如何在ScrollView滑动的瞬间禁用拖拽手势

    如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...

  8. UIScrollView原理

    我是Mike Ash的Let’s Build…系列文章的忠实粉丝,在这一系列文章中他从头设计Cocoa的控件来解释他们的工作原理.在这里我要做一点类似的事情,用几行代码来实现我自己的滚动试图.不过首先 ...

  9. IOS开发之代码之九宫格

    通过UIScrollView展示图片的时候,如果直接向UIScrollView添加UIImageView,在图片数量比较少的时候是没有问题的,但是当我们添加图片数量非常多的时候,会占用大量的内存,我们 ...

随机推荐

  1. Electron笔记

    一个能让你用Web技术开发桌面应用的开源项目.这里做一个笔记(非正式文章): 官网地址:http://electron.atom.io/ API相关 Electron提供的主进程接口.渲染进程接口.共 ...

  2. 原生JS:Array对象详解

    Array对象 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...

  3. 升级tomcat7的运行日志框架到log4j2,可以打进kafka

    为了让web application能随意使用logging组件而不受web容器自身的影响,从tomcat 6.0开始,tomact默认使用的是java.util.logging framework来 ...

  4. Autodesk 招人了,开发顾问,感兴趣的或者有推荐的人扔简历过来啊

    Autodesk ADN招人了,在上海,开发顾问, JD如下. 如果你感兴趣或者有人推荐,扔简历过来啊, daniel.du@autodesk.com,赶早不赶晚啊.   Job Title: Dev ...

  5. Autodesk Vault: 获取授权失败

    在登录Vault Explorer时弹出对话框,获取授权失败,不能登录. 1.首先Autodesk Vault Professional采用网络版授权方式,在安装之前之前你需要首先配置网络授权服务器, ...

  6. 好推二维码如何通过应用宝微下载支持微信自动打开APP下载?

    好推二维码 官网 http://www.hotapp.cn 1. 为什么使用应用宝微下载? APP下载二维码,通过微信扫描下载的时候,微信目前只支持应用宝微下载,才能在微信里直接打开下载,否则就需要在 ...

  7. 在android用Get方式发送http请求

    烦人的日子终于过去啦,终于又可以写博客啦,对自己的android学习做个总结,方便以后查看...... 一.在android用Get方式发送http请求,使用的是java标准类,也比较简单. 主要分以 ...

  8. Android studio 如何查看当前git 分支的4种方式

    1.第一种       2.第二种       3.第三种 4.第四种       前面3种都是通过android studio 操作的. 第四种是通过命令行操作.(可以在 git bash 中输入命 ...

  9. 搭建一个完整的Android工程(一)Dagger2

    写在前面 现在越来越多的使用到了开源项目,但是仅限于使用,却不了解,更谈不上深入.也是因为越来越多的开源项目,平时工作中遇到问题也是第一时间寻找对应的开源项目,少了许多独立的思考.现在虽然能很轻松的完 ...

  10. c中的进制与内存分析

    一. 进制 1. 什么是进制 l 是一种计数的方式,数值的表示形式 数一下方块的个数 汉字:十一   十进制:11  二进制:1011  八进制:13 l 多种进制:十进制.二进制.八进制.十六进制. ...