UIScrollView 滑动复位
需求
在每次打开界面滑动列表都是复位状态(未滑动)。
分析
在制作滑动列表时常常会结合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;
UIScrollView 滑动复位的更多相关文章
- 固定UIScrollView滑动的方向
固定UIScrollView滑动的方向 一般而言,我们通过这两个参数CGRectMake以及contentSize就可以自动的让UIScrollView只往一个方向滚动.但我遇到过非常奇葩的情况,那就 ...
- UIPanelResetHelper(UIScrollView滚动复位)
原理 如果我们的UI中有滑动列表,并且列表比较长,那么不知道你们是否有这样需求,每次页面打开时,列表的滑动状态都恢复到默认状态. 如果要复位,其实就是修改UIPanel 的属性到初始状态.此组件做的工 ...
- UIScrollView 滑动试图
UIScrollView --->UIView //创建UIScrollView testScrollView=[[UIScrollView alloc]init]; testScrollVie ...
- iOS中如何使定时器NSTimer不受UIScrollView滑动所影响
以下是使用 scheduledTimerWithTimeInterval 方法来实现定时器 - (void)addTimer { NSTimer scheduledTimerWithTimeInter ...
- IOS开发之--UIScrollView pagingEnabled自定义翻页宽度
用到UIScrollview的翻页效果时,有时需要显示一部分左右的内容,但是UIScrollView的PagingEnabled只能翻过整页,下面几个简单的设置即可实现 技术点: 1. 创建一个继承U ...
- IOS开发之UIScrollVIew运用
UIScrollView可以实现在一个界面看到所有内容,同时也不需要担心所显示的内容超出屏幕的大小,当超出之后可以翻阅至下一页浏览. #pragma mark - UIScrollViewDelega ...
- 如何在ScrollView滑动的瞬间禁用拖拽手势
如何在ScrollView滑动的瞬间禁用拖拽手势 效果: 在UIScrollView滑动的瞬间禁用pan手势,可以防止用户按着屏幕不放后导致出现的一些莫须有的bug. // // ViewContro ...
- UIScrollView原理
我是Mike Ash的Let’s Build…系列文章的忠实粉丝,在这一系列文章中他从头设计Cocoa的控件来解释他们的工作原理.在这里我要做一点类似的事情,用几行代码来实现我自己的滚动试图.不过首先 ...
- IOS开发之代码之九宫格
通过UIScrollView展示图片的时候,如果直接向UIScrollView添加UIImageView,在图片数量比较少的时候是没有问题的,但是当我们添加图片数量非常多的时候,会占用大量的内存,我们 ...
随机推荐
- VMware: XXX is still busy. Please wait until the operation is complete before closing
在使用vmware的过程中发现创建快照.恢复快照.管理快照等功能突然都变成灰色的,用不了.更觉得夸张的是仅仅剩下关闭虚机按钮是红色的.心想估计是虚机快照没处理完之类的问题导致的,于是想想关闭虚机重 ...
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- iOS多线程中,队列和执行的排列组合结果分析
本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...
- VSS、RSS、PSS、USS
VSS:Virtual Set Size,虚拟耗用内存.它是一个进程能访问的所有内存空间地址的大小.这个大小包含了一些没有驻留在RAM中的内存,就像mallocs已经被分配,但还没有写入.VSS很少用 ...
- 在iOS开发过程中你遇到这个问题了么?
1.问题:加载UIWebView底部有黑色边框问题. 设置UIWebView opaque为NO,然后设置其背景色为clearColor. 2.问题:iPhone真机输出[UIScreen mainS ...
- 【代码笔记】iOS-点评内容
一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...
- 【Andorid】短视频拍摄SDK——Vitamio Recorder 2.0 发布(支持ffmpeg命令行)
简介 VCamera SDK Android 版(短视频拍摄SDK)是炫一下(北京)科技有限公司推出的软件开发工具包,为Android开发者提供简单.快捷的接口,帮助开发者实现Android平台上的短 ...
- CSS行高——line-height
学习资料 : http://www.cnblogs.com/dolphinX/p/3236686.html
- get和post的区别与乱码问题解决
★ get和post的区别: 1.get请求通过url地址发送请求参数,可以在地址栏上直接显示 2.post请求通过请求体发送请求参数,不会再地址栏上显示 3.get在地址栏显 ...
- Web环境使用相对路径发布Webservice
常我们的Webservice服务的发布地址都将是一个相对路径,在与Spring一起使用时我们需要引入Cxf配置Webservice的schema,如jaxws,用以定义对应的Webservice. & ...