当用户发起触摸滚动时会顺序激发如下的委托调用:
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
//当设置scrollsToTop为true时,默认为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的情况,你先按住一个cell,cell开始高亮,手不要放开,开始滑动,tableView开始滚动,高亮取消。
delaysContentTouches的作用:
这个标志默认是YES,使用上面的150ms的timer,如果设置为NO,touch事件立即传递给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滚动。