12

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

谢谢

4

2 回答 2

35

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在取消之前您可能会得到不止一个。

因此,如果您设置cancelsTouchesInViewYES(默认值),系统将在从手势识别器发送第一条消息之前取消触摸,并且您不会再收到与该触摸相关的任何触摸消息。

如果手势识别器cancelsTouchesInView设置为NO应用程序将记录以下消息:

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

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

于 2012-10-24T03:50:20.900 回答
2

从苹果开发者门户链接

cancelsTouchesInView — 如果手势识别器识别出它的手势,它会解除该手势的剩余触摸与视图的绑定(因此窗口不会传递它们)。窗口使用 (touchesCancelled:withEvent:) 消息取消先前传递的触摸。如果手势识别器无法识别其手势,则视图将接收多点触摸序列中的所有触摸。

取消TouchesInView:

一个布尔值,影响在识别手势时是否将触摸传递到视图。

@property(nonatomic) BOOL cancelsTouchesInView

讨论

当此属性为 YES(默认值)并且接收器识别其手势时,该手势的未决触摸不会传递到视图,并且先前传递的触摸会通过发送到视图的 touchesCancelled:withEvent: 消息取消。如果手势识别器无法识别其手势或者此属性的值为 NO,则视图将接收多点触控序列中的所有触摸。

于 2012-10-24T03:38:54.183 回答