我正试着让touchesEnded在做手势后开火。我已经包含了一个代码片段,在其中touchesBegan和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发布于 2013-10-05 21:01:25
这是一个直接涉及UIGestures架构的工作方式的问题。delaysTouchesEnded基本上会延迟向touchesEnded:withEvent:发送消息,并且将此值设置为NO并不一定意味着事件将被触发。
从医生那里:
如果手势识别器随后识别它的手势,则取消这些触摸对象(通过触摸cancelled :withEvent: message)。如果手势识别器不识别它的手势,窗口将在视图的touchesEnded:withEvent:方法的调用中传递这些对象。将此属性设置为NO,以便在手势识别器分析相同的触摸时,将UITouchPhaseEnded中的触摸对象传递给视图。
在您的代码片段中,实际上没有启用touchesBegan和touchesEnded。所发生的事情是,您正在禁用“延迟”是否该手势将允许touchesBegan或touchesEnded可用于触发。
当delaysTouchesBegan设置为NO时,会发生以下情况:
touchesBegan确实发生了(因为手势被识别了)touchesBegan火灾使用delaysTouchesEnded时,touchesEnded的触发取决于手势是否成功完成。与前一种情况不同的是,touchesBegan总是在手势的开头出现。
在这种情况下发生的情况如下:
UIGestureRecognizer的预期行为)。. touchesEnded发生在:
touchesEnded被解雇了在代码中,如果您按下,保持手势而不移动手指,然后在touchesEnded被触发后释放。原因是PAN没有成功完成并允许touchesEnded启动。
另一种方法
你是在做手势,所以你想要发生的任何互动都应该考虑到你正在做的手势。也就是说,当您开始使用手势时,尝试并考虑手势,知道它将介于您所接触的视图与其固有的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永远不会被触发的原因,因为当手势开始时,系统会识别“触摸”不是真正的触摸,而是真正的手势。
https://stackoverflow.com/questions/19193406
复制相似问题