UIScrollView类详解

当用户发起触摸滚动时会顺序激发如下的委托调用:



scrollViewWillBeginDragging:isTracking:1, isDragging:1, isDelect:0

//多次调用scrollViewDidScroll

scrollViewDidScroll:isTracking:1, isDragging:1, isDeclerating:0


//下面的委托方法中的参数表示:(CGPoint)velocitytargetContentOffset:(inoutCGPoint *)targetContentOffset


//velocity:滚动的速率,是滚动的点/秒。targetContentOffset最终滚动条停止的位置,我们可以设置这个位置让滚动条的位置定位在这里,这个位置会在滚动动画结束后才快速的转到这个位置的。


scrollViewWillEndDragging:isTracking:1, isDragging:0, isDeclerating:0


//手已经离开了视图decelerate告诉我们后续会不会有减速的滚动。

scrollViewDidEndDragging:willDecelerate:(BOOL)decelerateisTracking:1, isDragging:0, isDeclerating:0


//下面的可能不会触发,当手指离开后会进行减速的滚动,下面就是将要减速时会调用:

scrollViewWillBeginDecelerating:isTracking:1, isDragging:0, isDeclerating:1

//多次调用

scrollViewDidScroll:isTracking:0, isDragging:0, isDeclerating:1

scrollViewDidEndDecelerating:isTracking:0, isDragging:0, isDeclerating:0



//当设置setContentOffset不带动画时只会激发一次的

scrollViewDidScroll


而当带动画时会激发多次

scrollViewDidScroll

并且最后激发如下委托方法。

ScrollViewDidEndScrollingAnimation




//当设置scrollsToToptrue时,默认为true.当用户触摸顶部状态栏时会激发这两个委托方法


//确定是否让滚动条滚动到顶部,

-(BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView

{

NSLog(@"scrollViewShouldScrollToTop");

returnNO;

}


//滚动条已经滚动到顶部了。

-(void)scrollViewDidScrollToTop:(UIScrollView*)scrollView

{

NSLog(@"scrollViewDidScrollToTop");

}



放大缩小:


只有设置了

_myscroll.maximumZoomScale= 5.0f;

_myscroll.minimumZoomScale= 0.1f;


才会支持放大缩小。最小必须小于最大

系统会通过委托

  • (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView;来要求指定某个放大缩小的视图,这个视图必须是scrollview的子视图。


每当执行缩放时会执行下列委托回调。



scrollViewWillBeginZooming

scrollViewDidZoom //多次执行

scrollViewWillBeginZoomingatScale:0.172880 //最后放大缩小的倍数。



//是否支持放大缩小反弹。

@property(nonatomic)BOOL bouncesZoom; //default is YES. if set, user can go past min/max zoom while gesturingand the zoom will animate to the min/max value at gesture end


//放大缩小中

@property(nonatomic,readonly,getter=isZooming) BOOLzooming; //returns YES if user in zoom gesture

//放大缩小反弹中。

@property(nonatomic,readonly,getter=isZoomBouncing) BOOLzoomBouncing; //returns YES if we are in the middle of zooming back to the min/maxvalue




从你的手指touch屏幕开始,scrollView开始一个timer,如果:

1. 150ms内如果你的手指没有任何动作,消息就会传给subView

2. 150ms内手指有明显的滑动(一个swipe动作),scrollView就会滚动,消息不会传给subView,这里就是产生问题二的原因。

3.150ms内手指没有滑动,scrollView将消息传给subView,但是之后手指开始滑动,scrollView传送touchesCancelled消息给subView,然后开始滚动。

观察下tableView的情况,你先按住一个cellcell开始高亮,手不要放开,开始滑动,tableView开始滚动,高亮取消。

 

delaysContentTouches的作用:

这个标志默认是YES,使用上面的150mstimer,如果设置为NOtouch事件立即传递给subView,不会有150ms的等待。

 

cancelsTouches的作用:

这个标准默认为YES,如果设置为NO,这消息一旦传递给subView,这scroll事件不会再发生,也就是scroll不会滚动了。




//SCrollVIEW的派生类可以重载这两个方法来决定是否把TOUCH事件让子视图来处理,默认返回YES

-(BOOL)touchesShouldBegin:(NSSet*)touches withEvent:(UIEvent*)event inContentView:(UIView*)view

{

NSLog(@"touchesShouldBegin");

returnYES; //返回NO则不会把事件传递给子视图,

}


-(BOOL)touchesShouldCancelInContentView:(UIView*)view

{

NSLog(@"touchesShouldCancelInContentView");

returnNO; //返回NO则不会终止子视图的TOUCH事件。

}



这里的一个例子是有时候scroll的子视图想截获或者处理事件而不让scroll滚动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值