您的位置:首页 > 产品设计 > UI/UE

UIScrollView 原理

2015-04-07 12:04 85 查看

UITableView、UITextView是UIScrollView的子类。

UITableViewController是UIViewController的子类。

UITableViewController是管理表格视图的。

表格视图单元是你的UITableView用来在自身显示数据的UIView子类。

UIScrollView是用来管理在它们之间卷动的类,在地图上显示,放大缩小等。

ContentOffset是你当前可视内容在滚轴视图边界的左上角的那个点,它不是从ContentInsets的左上角开始,而是内容的左上角。

ContentInset是scrollview中contentView.frame.origin与scrollview.frame.origin的关系.

CGRecctframe=CGRectMake(0,0,200,200);//创建框架

scrollView=[[UIScrollViewalloc]initWithFrame:frame];//把它加为我们视图的一个子视图,后把其它一些内容视图当作子视图添加给它


添加子视图subviews

ScollView中添加左右移动的UIImageView

frame=CGRectMake(0,0,500,500);//比可见视图大,当左右移动时隔不久不同部分会移动进来

myImageView=[[UIImageViewalloc]initWithFrame:frame];

[scrollViewaddSubview:myImageView];

//Setthecontentsize

scrollView.contentSize=CGSizeMake(500,500);


-(void)scrollViewDidScoll:(UIScrollView*)scrollView;


它在每次滚轴视图的ContentOffset改变时都会被调用,当用户在四周移动手指时也会一直被调用


-(BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView;


响应事件的一个例子



scrollview原理

http://www.cocoachina.com/bbs/read.php?tid-40965-page-1.html

关于事件处理的认识:

首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView应该是重载了hitTest方法,并总会返回itself。所以所有的touch事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。

为了检测touch是处理还是传递,UIScrollView当touch发生时会生成一个timer。

(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view

(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)

(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且
canCancelContentTouches=
YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如
当你touch一个table,停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)

在滚动过程当中,其实是在修改原点坐标。当手指触摸后,scroll
view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么scrollview发送tracking
events到被点击的subview。假如在计时器到点前发生了移动事件,那么scrollview取消tracking自己发生滚动。

子类可以重载

touchesShouldBegin:withEvent:inContentView:决定自己是否接收touch事件

pagingEnabled:当值是YES会自动滚动到subview的边界,默认是NO

touchesShouldCancelInContentView:开始发送trackingmessages消息给subview
的时候调用这个方法,决定是否发送trackingmessages消息到subview。假如返回NO,发送。YES则不发送。

假如canCancelContentTouches属性是NO,则不调用这个方法来影响如何处理滚动手势。

scrollview还处理缩放和平移手势,要实现缩放和平移,必须实现委托viewForZoomingInScrollView:、scrollViewDidEndZooming:withView:atScale:

两个方法。另外maximumZoomScale和minimumZoomScale两个属性要不一样。

几个属性介绍

tracking

当touch后还没有拖动的时候值是YES,否则NO

zoomBouncing

当内容放大到最大或者最小的时候值是YES,否则NO

zooming

当正在缩放的时候值是YES,否则NO

decelerating

当滚动后,手指放开但是还在继续滚动中。这个时候是YES,其它时候是NO

decelerationRate

设置手指放开后的减速率

maximumZoomScale

一个浮点数,表示能放最大的倍数

minimumZoomScale

一个浮点数,表示能缩最小的倍数

pagingEnabled

当值是YES会自动滚动到subview的边界。默认是NO

scrollEnabled

决定是否可以滚动

delaysContentTouches

是个布尔值,当值是YES的时候,用户触碰开始,scrollview要延迟一会,看看是否用户有意图滚动。假如滚动了,那么捕捉
touch-down事件,否则就不捕捉。假如值是NO,当用户触碰,scrollview会立即触发
touchesShouldBegin:withEvent:inContentView:,默认是YES

canCancelContentTouches

当值是YES的时候,用户触碰后,然后在一定时间内没有移动,scrollView发送tracking
events,然后用户移动手指足够长度触发滚动事件,这个时候,scrollView发送了
touchesCancelled:withEvent:到subview,然后scroView开始滚动。假如值是
NO,scrollView发送trackingevents后,就算用户移动手指,scrollView也不会滚动。

contentSize

里面内容的大小,也就是可以滚动的大小,默认是0,没有滚动效果。

showsHorizontalScrollIndicator

滚动时是否显示水平滚动条

showsVerticalScrollIndicator

滚动时是否显示垂直滚动条

bounces

默认是yes,就是滚动超过边界会反弹有反弹回来的效果。假如是NO,那么滚动到达边界会立刻停止。

bouncesZoom

和bounces类似,区别在于:这个效果反映在缩放上面,假如缩放超过最大缩放,那么会反弹效果;假如是NO,则到达最大或者最小的时候立即停止。

directionalLockEnabled

默认是NO,可以在垂直和水平方向同时运动。当值是YES时,假如一开始是垂直或者是水平运动,那么接下来会锁定另外一个方向的滚动。假如一开始是对角方向滚动,则不会禁止某个方向

indicatorStyle

滚动条的样式,基本只是设置颜色。总共3个颜色:默认、黑、白

scrollIndicatorInsets

设置滚动条的位置

转自:http://www.cnblogs.com/Snowfun/archive/2011/05/19/2051001.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: