显示屏左侧的TouchesBegan延迟

时间:2016-10-12 12:21:11

标签: ios objective-c iphone sprite-kit touchesbegan

在启用了3D触控功能的iPhone上,有一项功能是长时间按下屏幕的左侧并打开足够的力可让您更改哪个应用程序处于活动状态。因此,当在屏幕的左侧发生非移动触摸时,触摸事件被延迟一秒或两秒,直到iPhone验证用户没有尝试切换任务并且正在与应用交互。

使用SpriteKit开发游戏时,这是一个主要问题,因为每次用户在屏幕左边缘点击/按住手指时,这些触摸会延迟一秒。我能够通过在游戏的主场景中注册UILongPressGestureRecognizer来解决这个问题,从而禁用TouchesBegan并实现自定义触摸功能(由手势识别器用作选择器):

-(void)handleLongPressGesture:(UITapGestureRecognizer *)gesture {

    CGPoint location = [gesture locationInView:self.view];

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        //
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        //
    }
    else if (gesture.state == UIGestureRecognizerStateEnded)
    {
        //
    }
    else if (gesture.state == UIGestureRecognizerStateCancelled)
    {
        //

    }
}

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */

    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)];

    longPressGestureRecognizer.delaysTouchesBegan = false;
    longPressGestureRecognizer.minimumPressDuration = 0;
    [view addGestureRecognizer:longPressGestureRecognizer];

    // continue
}

这个问题是我必须为我希望用户输入的每次触摸(包括同步触摸)实现手势识别器。这会干扰任何touchesBegan方法作为SKSpriteNodeSKScene等的子类,并会破坏许多功能。

有没有办法禁用此延迟?注册gestureRecognizer时,我能够将delaysTouchesBegan属性设置为false。我能以某种方式为我的SKScene做同样的事吗?

要查看此问题,您可以运行默认的SpriteKit项目,然后点按屏幕左侧附近(按住一两秒钟)。您将看到触摸屏幕和呈现SKShapeNodes之间存在延迟(而不是触摸屏幕上的任何其他位置)。

*编辑1 * 对于那些试图找到解决方法的人来说,你可以保留手势识别器,但将其cancelsTouchesInView设置为false。使用手势识别器完成您需要做的所有事情,直到TouchesBegan开始(touchesBegan将在手势识别器识别触摸后大约一秒钟接收相同的触摸事件)。一旦touchesBegan启动,您就可以禁用手势识别器中发生的所有事情。这对我来说似乎是一个草率的修复,但它现在有效。

仍然试图找到一个或多或少正式的解决方案。

1 个答案:

答案 0 :(得分:0)

我作为一名用户体验过这一点,实在令人讨厌。唯一对我有用的是禁用3D触控。否则触摸屏的左侧几乎没用。