我试图让 touchesEnded 在一个手势后触发。我已经包含了一个代码片段,其中 touchesBegan 和 touchesEnded 都可以触发。我用下面的代码得到两个奇怪的行为。当我平移它打印开始和刷卡结束。当我触摸 Canvas 时,我会收到一条开始消息和两条结束消息。
我尝试删除 touchesBegan 以确保它与 touchesEnded 不冲突,但行为是相同的。
#import "C4WorkSpace.h"
@implementation C4WorkSpace
-(void)setup
{
[self addGesture:PAN name:@"pan" action:@"bbb:"];
[self gestureForName:@"pan"].delaysTouchesBegan = NO;
[self gestureForName:@"pan"].delaysTouchesEnded = NO;
}
-(void) bbb : (UIGestureRecognizer *) recognizer
{
if(recognizer.state == UIGestureRecognizerStateEnded)
C4Log(@"Swipe Ended");
}
-(void) touchesBegan
{
C4Log(@"Begin");
}
-(void) touchesEnded
{
C4Log(@"End");
}
@end
最佳答案
这是一个直接涉及 UIGestures 的工作方式的问题。 delaysTouchesEnded
基本上是 延迟 将消息发送到 touchesEnded:withEvent:
并将此值设置为 NO
并不一定意味着将触发事件。
从文档:
在您的代码片段中,touchesBegan
和 touchesEnded
实际上并未启用。发生的事情是您正在禁用手势是否允许 touchesBegan
或 touchesEnded
可用于触发的“延迟”。delaysTouchesBegan
设置为 NO 时,会发生以下情况:
touchesBegan
确实发生了(因为手势识别) touchesBegan
触发 使用
delaysTouchesEnded
时,touchesEnded
的触发取决于手势是否成功完成......与之前的 touchesBegan
总是实际发生在手势开始的情况不同。在这种情况下会发生以下情况:
UIGestureRecognizer
...
touchesEnded
发生在:touchesEnded
被解雇 用你的代码,如果你触摸,保持手势而不移动你的手指,然后在
touchesEnded
被触发一段时间后释放。原因是 PAN
没有成功完成并允许 touchesEnded
触发。不同的方法
您正在使用手势,因此您希望发生的任何交互都应考虑您正在使用的手势......也就是说,当您开始使用手势时,请尝试考虑 手势 ,知道它将介于您正在触摸的 View 与其固有的
touchesBegan
等方法之间。底线
您的
bbb:
方法是完美的。 使用手势时,通过像这样的方法来确定手势的各种状态。这就是您想要使用手势的方式。
试试下面的代码:
#import "C4WorkSpace.h"
@implementation C4WorkSpace
-(void)setup
{
[self addGesture:PAN name:@"pan" action:@"bbb:"];
[self gestureForName:@"pan"].delaysTouchesBegan = NO;
[self gestureForName:@"pan"].delaysTouchesEnded = NO;
}
-(void) bbb : (UIGestureRecognizer *) recognizer {
if(recognizer.state == UIGestureRecognizerStateBegan) {
C4Log(@"PAN Begin");
}
if(recognizer.state == UIGestureRecognizerStateEnded) {
C4Log(@"PAN ended");
}
}
-(void)touchesBegan {
C4Log(@"A touch began");
}
-(void)touchesEnded {
C4Log(@"A touch ended");
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
C4Log(@"A touch cancelled");
}
@end
注意到
TOUCH
事件在你对手势进行 BEGIN
后被取消了吗?这就是 touchesEnded
永远不会被触发的原因,因为当 GESTURE 开始时,系统会识别出“触摸”并不是真正的触摸,而是真正的手势。关于ios - touchesEnded with addGesture,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19193406/