UIScrollView类详解

来源:互联网 发布:mac玩qq游戏大厅 编辑:程序博客网 时间:2024/06/03 19:11

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



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
原创粉丝点击