gpt4 book ai didi

ios - touchesEnded with addGesture

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:32 26 4
gpt4 key购买 nike

我正在尝试让 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 不会t 一定意味着事件将被触发。

来自文档:

If the gesture recognizer subsequently recognizes its gesture, these touch objects are cancelled (via a touchesCancelled:withEvent: message). If the gesture recognizer does not recognize its gesture, the window delivers these objects in an invocation of the view’s touchesEnded:withEvent: method. Set this property to NO to have touch objects in the UITouchPhaseEnded delivered to the view while the gesture recognizer is analyzing the same touches.

在您的代码片段中,touchesBegantouchesEnded 实际上并未启用触发。发生的事情是您禁用手势是否允许 touchesBegantouchesEnded 可用于触发的“延迟” .

delaysTouchesBegan 设置为 NO 时,会发生以下情况:

  1. 触摸发生
  2. 手势拦截
  3. 识别手势
  4. touchesBegan 实际发生了(因为手势被识别)
  5. 没有延迟,touchesBegan 触发

对于 delaysTouchesEndedtouchesEnded 的触发取决于手势是否成功完成...与之前的情况不同,touchesBegan 总是实际上发生在手势的开始。

在这种情况下会发生以下情况:

  1. 正在识别手势
  2. 手势成功完成
  3. 手势取消触摸手势发生的 View (这是 UIGestureRecognizer
  4. 的预期行为

... touchesEnded 发生在:

  1. 正在识别手势
  2. 手势完成不成功
  3. touchesEnded 被触发

使用您的代码,如果您触碰,请按住手势而不移动手指,然后在 touchesEnded 被触发后松开。原因是 PAN 没有成功完成并允许 touchesEnded 触发。

不同的方法

你正在使用一个手势,所以你想要发生的任何交互都应该考虑到你正在使用的手势......也就是说,当你开始使用一个手势时,试着从 < strong>手势,知道它会介于您正在触摸的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com