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的关系.
添加子视图subviews
ScollView中添加左右移动的UIImageView
-(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
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原理
关于事件处理的认识:
首先了解下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
相关文章推荐
- IOS开发UI展示之UIScrollView ──原理
- UIScrollView 原理
- UIScrollView 原理详解
- UIScrollView 原理详解
- UIScrollView的作用原理,实现scrollView中touch事件作用子视图
- UIScrollView 原理
- UIScrollView 原理详解
- UIScrollView 原理
- UIScrollView 原理详解
- UIScrollView 原理详解
- UIScrollView 原理(转)
- UIScrollView 原理详解
- UIScrollView 原理详解
- UIScrollView 原理(转载)
- UIScrollView 原理
- UIScrollView 原理
- UIScrollView 原理详解
- ios UIScrollView原理
- UISCroll View 原理
- UIScrollView 原理详解