UIScrollView之isTracking delaysContentTouches canCancelContentTouches

UIScrollView有一个BOOL类型的tracking属性,用来回到用户是或不是早已接触内容并打算开头滚动,大家从那个特性初叶讨论UIScrollView的干活原理:

当手指触摸到UIScrollView内容的一弹指,会时有暴发上面的动作:

  • 阻拦触摸事件
  • tracking属性变为YES

  • 一个放权的计时器先导生效,用来监督在极短的事件间隔内是还是不是暴发了手指运动

    case1:当检测到时刻间隔内手指暴发了活动,UIScrollView自己触发滚动,tracking属性变为NO,手指触摸下即便有(可以响应触摸事件的)内部控件也不会再响应触摸事件。

    case2:当检测到时刻距离内手指没有活动,tracking属性保持YES,手指触摸下一旦有(可以响应触摸事件的)内部控件,则将触摸事件传递给控件进行拍卖。

     

有成百上千信息类的App顶部都有一个滑行菜单栏,首要模型可能是由一个UIScrollView包括多少个UIButton控件组成;当你操作的时候,手指借使是很迅猛的在地方划过,会意识就是手指触摸的地点有UIButton,可是并没有接触该UIButton的其余触摸事件,那就是上边提到的case1;当您手指是迟迟划过或根本就没动,才会触发UIButton的触摸事件,那是case2的处境。

上面的工作规律其实有一个特性开关来决定:delaysContentTouches。默许值为YES;假若设置为NO,则无论手指运动的多多快,始终都会将触摸事件传递给其中控件;设置为NO可能会影响到UIScrollView的轮转效应。

再看另一个BOOL类型的属性canCencelContentTouches,从字面上明白是“可以裁撤情节触摸“,默许值为YES。文档里的解释是那般的:

A Boolean value that controls whether touches in the content view always
lead to tracking.

If the value of this property is YES and a view in the content has begun
tracking a finger touching it, and if the user drags the finger enough
to initiate a scroll, the view receives a touchesCancelled:withEvent:
message and the scroll view handles the touch as a scroll. If the value
of this property is NO, the scroll view does not scroll regardless of
finger movement once the content view starts tracking.

翻译为中文大致如下:

这几个BOOL类型的值控制content view里的入手是不是总能引发跟踪(tracking)

要是属性值为YES并且跟踪到手指正触摸到一个情节控件,那时假设用户拖入手指的相距充分爆发滚动,那么内容控件将接收一个touchesCancelled:with伊夫(Eve)nt:音讯,而scroll
view将这一次触摸作为滚动来拍卖。如果值为NO,一旦content
view开端盯住(tracking==YES),则不管手指是或不是移动,scrollView都不会滚动。

简单来讲通俗点说,如果为YES,就会等待用户下一步动作,如若用户移入手指到自然距离,就会把那么些操作作为滚动来拍卖并开首滚动,同时发送一个touchesCancelled:with伊夫nt:消息给内容控件,由控件自行处理。如果为NO,就不会等待用户下一步动作,并始终不会触发scrollView的轮转了。

可以用一段代码来证实并洞察一下,定义一个MyScrollView继承自UIScrollView,一个MyButton继承自UIButton,然后重写一些方法:

MyScrollView.m

图片 1

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    [super touchesShouldCancelInContentView:view];

    NSLog(@"touchesShouldCancelInContentView");

    return YES;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];


    NSLog(@"touchesCancelled");
}

图片 2

MyButton.m

图片 3

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];

    NSLog(@"【Button's touch cancelled】");
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    NSLog(@"【Button's touch began】");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    NSLog(@"【Button's touch moved】");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

    NSLog(@"【Button's touch ended】");
}

图片 4

实在就是在各种艺术执行时打印出一个符号,当canCencelContentTouches值为YES时,用户触摸并活下手指再推广:

【Button’s touch began】

【Button’s touch moved】

  ……

【Button’s touch moved】

touchesShouldCancelInContentView

【Button’s touch cancelled】

当canCencelContentTouches值为NO时,用户触摸并活动手指再放手:

【Button’s touch began】

【Button’s touch moved】

  ……

【Button’s touch moved】

【Button’s touch ended】

 参考链接:

http://www.jianshu.com/p/9436c9a2cd1e

 http://blog.csdn.net/opentogether/article/details/52223878