调用setCancelsTouchesInView时会发生什么?

时间:2012-10-24 03:34:06

标签: iphone objective-c ios uigesturerecognizer

想知道当我调用setCancelsTouchesInView时会发生什么。官方文件http://developer.apple.com/library/ios/#documentation/uikit/reference/UIGestureRecognizer_Class/Reference/Reference.html

中未涉及此问题

由于

2 个答案:

答案 0 :(得分:31)

ACB引用UIGestureRecognizer引用。为了使它更具体一些,假设您有一个附加了平移手势识别器的视图,并且您在视图控制器中有这些方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesBegan");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesMoved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesEnded");
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesCancelled");
}

- (IBAction)panGestureRecognizerDidUpdate:(UIPanGestureRecognizer *)sender {
    NSLog(@"panGesture");
}

当然,平移手势识别器配置为发送panGestureRecognizerDidUpdate:消息。

现在假设您触摸视图,移动手指足以识别平移手势,然后抬起手指。该应用程序打印什么?

如果手势识别器的cancelsTouchesInView设置为YES,应用会记录以下消息:

touchesBegan
touchesMoved
touchesCancelled
panGesture
panGesture
(etc.)

取消前您可能会获得多个touchesMoved

因此,如果您将cancelsTouchesInView设置为YES(默认设置),系统会在从手势识别器发送第一条消息之前取消触摸,您将不再接触该触摸的相关信息。

如果手势识别器的cancelsTouchesInView设置为NO,应用会记录以下消息:

touchesBegan
touchesMoved
panGesture
touchesMoved
panGesture
touchesMoved
panGesture
(etc.)
panGesture
touchesEnded

因此,如果您将cancelsTouchesInView设置为NO,系统将继续发送手势触摸的触摸相关消息,与手势识别器的消息交错。触摸将正常结束而不是被取消(除非系统因某些其他原因取消触摸,例如在触摸期间按下主页按钮)。

答案 1 :(得分:2)

来自Apple开发人员门户网站link

  

cancelsTouchesInView - 如果手势识别器识别出其手势,   它从他们的视角中取消了该手势的剩余触摸(所以   窗口不会传递它们)。窗口取消之前的   使用(touchesCancelled:withEvent :)消息传递触摸。如果一个   手势识别器无法识别其手势,视图会收到   多触摸序列中的所有触摸。

     

<强> cancelsTouchesInView:

     

影响触摸是否为的布尔值   在识别出手势时传送到视图。

     

@property(非原子)BOOL cancelsTouchesInView

     

讨论

     

当这个   属性为YES(默认值),接收器识别其手势,   挂起的那个手势的触摸不会被传递给   查看和以前交付的触摸通过a取消   touchesCancelled:withEvent:消息发送到视图。如果一个手势   识别器无法识别其手势或此值   属性为NO,视图接收多点触控中的所有触摸   序列