UIScrollView

 
在滚动过程当中,其实是在修改原点坐标

当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器,假如在计时器到点后,没有发生手指移动事件,那么,scroll view发送tracking events到被点击的subview
假如在计时器到点前,发生了移动事件,那么 scroll view 取消tracking自己发生滚动

子类可以重载touchesShouldBegin:withEvent:inContentView: 决定自己是否接收touch事件
pagingEnabled当值是YES,会自动滚动到subview的边界,默认是NO
touchesShouldCancelInContentView: 开始发送tracking messages消息给subview的时候
调用这个方法,决定是否发送tracking messages消息到subview,假如返回NO,发送,YES则不发送
假如 canCancelContentTouches属性是NO,则不调用这个方法
来影响如何处理滚动手势

scroll view还处理缩放和平移手势

要实现缩放和平移,必须实现委托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的时候,用户触碰开始,scroll view要延迟一会,看看是否用户有意图滚动,假如滚动了,那么捕捉touch-down事件,否则就不捕捉, 假如值是NO,当用户触碰, scroll view会立即触发touchesShouldBegin:withEvent:inContentView:, 默认是YES

canCancelContentTouches
当值是YES的时候,用户触碰后,然后在一定时间内没有移动,scrollView发送tracking events,然后用户移动手指足够长度触发滚动事件,这个时候,scrollView发送了touchesCancelled:withEvent: 到subview,然后scroView开始滚动
假如值是NO,scrollView发送tracking events后,就算用户移动手指,scrollView也不会滚动
 
contentSize 里面内容的大小,也就是可以滚动的大小,默认是0,没有滚动效果。
 
showsHorizontalScrollIndicator 滚动时,是否显示水平滚动条
 
showsVerticalScrollIndicator 滚动时,是否显示垂直滚动条
 
bounces  默认是yes,就是滚动超过边界,会反弹有反弹回来的效果,假如是 NO,那么滚动到达边界,那么会连忙停止
 
bouncesZoom  和bounces类似,区别在于,这个效果反映在缩放上面,假如缩放超过最大缩放,那么会反弹效果,假如是NO,则到达最大或者最小的时候,立即停止
 
directionalLockEnabled  默认是NO, 可以在垂直和水平方向同时运动, 当值是YES, 假如一开始是垂直或者是水平运动,那么接下来会锁定另外一个方向的滚动, 假如一开始是对角方向滚动,则不会禁止某个方向
 
indicatorStyle  滚动条的样式,基本只是设置颜色,总共3个颜色,默认,黑色的,白色的
 
scrollIndicatorInsets  设置滚动条的位置

--
UIScrollView分页的实现
2011-08-24 17:24

UIScrollView的经典例子就是safari的编辑模式了

UIScrollView可以垂直,水平滚动。

如果属性pageEnabled = YES,则设置其为分页模式,那么没滚动一次就是一页,垂直方向上的一页就是UIScrollView的高度,水平方向就是其宽度。

我们可以设置contentSize,这就是UIScrollView可以滚动的最大区域了。

UIScrollView没有datasource的概念,因为这就是一个view,具体view中的内容摆放完全随意,只是每次都会滚动固定的页面大小。

比如我们有5个页面,我们需要自己计算每个页面的位置,将其水平放在UIScrollView上。

contentSize则设置为5*每个页面的宽度,每个页面的高度。

如果contentSize的高度或这宽度正好与UIScrollView的高度或宽度相等,则在该方向上不能滚动。

具体例子可以查看官方文档的例子,PageControl。

注意:UIScrollView不会带有分页的指示符号,需要利用UIPageControl控制。

但是要想做到safari的效果,我们需要一个小技巧,因为在safari中,当前页时可以看到前后两页的部分内容。

注意:分页的宽度不能修改,所以我们只能缩小UIScrollView的宽度,让其不要占满整个屏幕,同时设置clipsToBouds属性为 NO,这样超出范围的视图也会显示,这样就能看到前后两页的内容,当然需要设置前后两页的alpha值为0.5,做出一个透明效果。

在UIScrollView的滚动事件中,判断位置,当一个页面出现的区域超过1半时,设置alpha为1,小于1半时设置alpha为0.5

现在还有一个问题:UIScrollView的滑动事件响应区域变小了,因为UIScrollView本身变小了,其余我们看到的页面在区域之外,因此我们需要重写UIScrollView所在的parentView的hittest事件,在其他区域的事件返回值为UIScrollView对象,这样用户感觉整个屏幕都是UIScrollView在响应了。

 

frame.size.width可视范围
contentSize  内部的范围只要大于可视范围,就可以卷动

若你要分页
frame.size.width   就是你一页宽度  , 假设= 280


你若要有三页
则你的contentSize宽至少要大于280 *2 +1 但小於等於 280*3,它就会有三页

 

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGPoint offsetofScrollView = contentScrollView.contentOffset;
    这里换成你的计算,想让它停到哪就让它停到哪//offsetofScrollView.x = ceil(offsetofScrollView.x/78)*78;
    [contentScrollView setContentOffset:offsetofScrollView];
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值