我试图在手势后触发触发。我已经包含了一个代码片段,其中触发了theBegan和touchesEnded都可以触发。我用下面的代码得到了两个奇怪的行为。当我平移时,打印开始并刷过结束。当我触摸画布时,我得到一个开头和两个结束消息。
我已经尝试删除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
答案 0 :(得分:4)
这是一个直接涉及UIGestures架构工作方式的问题。 delaysTouchesEnded
基本延迟向touchesEnded:withEvent:
发送邮件并将此值设置为NO
并不一定意味着将触发事件。
来自文档:
如果手势识别器随后识别出其手势,则这些 触摸对象被取消(通过touchesCancelled:withEvent: 信息)。如果手势识别器无法识别其手势, 窗口在视图的调用中传递这些对象 touchesEnded:withEvent:方法。将此属性设置为NO以进行触摸 UITouchPhaseEnded中的对象在传递给视图时 手势识别器正在分析相同的触摸。
在您的代码段中,touchesBegan
和touchesEnded
实际上无法启动。发生的事情是,您是否会停止“延迟”该手势是否允许 touchesBegan
或touchesEnded
可用于解雇。
将delaysTouchesBegan
设置为NO,会发生以下情况:
touchesBegan
(因为识别出手势)touchesBegan
开火使用delaysTouchesEnded
touchesEnded
的触发取决于手势是否成功完成...与前一种情况不同,touchesBegan
总是在手势开始时实际发生。
在这种情况下会发生以下情况:
UIGestureRecognizer
的预期行为 ... touchesEnded
发生在:
touchesEnded
被解雇如果您触摸了代码,请在不移动手指的情况下握住手势,然后在touchesEnded
被触发后稍微释放。原因是PAN
无法成功完成,并允许touchesEnded
触发。
您正在使用手势,因此您想要发生的任何互动都应考虑到您正在使用的手势......也就是说,当您开始使用手势时,请尝试并根据< strong>手势,知道它将介于您正在触摸的视图与其固有的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开始时,系统会识别出“触摸”并不是真正的触摸,而且实际上是一种手势。