【发布时间】:2016-10-12 12:21:10
【问题描述】:
在启用了 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
}
这样做的问题是,我必须为我希望用户输入的每个触摸(包括同时触摸)实现一个手势识别器。这会干扰作为SKSpriteNode、SKScene 等子类的任何touchesBegan 方法,并扼杀很多功能。
有什么办法可以禁用这种延迟?注册gestureRecognizer时,我能够将delaysTouchesBegan属性设置为false。我可以为我的 SKScene 做同样的事情吗?
要查看此问题的实际效果,您可以运行默认的 SpriteKit 项目,然后在屏幕左侧附近点按(按住一两秒)。您将看到在您触摸屏幕和呈现 SKShapeNodes 之间存在延迟(而不是触摸屏幕上的其他任何位置)。
* 编辑 1 *
对于那些试图暂时解决此问题的人,您可以保留手势识别器,但将其 cancelsTouchesInView 设置为 false。使用手势识别器完成您需要做的所有事情,直到 TouchesBegan 启动(touchesBegan 将在手势识别器识别触摸后大约一秒收到相同的触摸事件)。一旦touchesBegan 启动,您可以禁用手势识别器中发生的所有事情。这对我来说似乎是一个草率的修复,但它现在有效。
仍在尝试找到一个或多或少正式的解决方案。
【问题讨论】:
-
解决同样的问题。更糟糕的是,移动的触摸会在 3d Touch 设备上触发,而 x 或 y 坐标没有变化,即您实际上并没有移动手指。我设法解决了这个问题,但我还没有解决你描述的问题。
-
是的,在连续触摸移动呼叫时遇到同样的问题。
-
在 3d Touch 设备上尝试使用 Force Touch 做一些移动的触摸操作。例如,在我的游戏中,我有一个播放器,当你点击并按住时,它会射击并进入慢动作。现在我使用强制触摸来获得压力变化以在 3D Touch 设备上进入慢动作,感觉很棒。它很容易实现,只需谷歌强制触摸压力变化。与没有 3d touch 的设备相比,这就是我所做的,而且我还没有遇到过问题,至少在我的游戏中是这样。 stackoverflow.com/questions/36060423/…
-
@crashoverride777 虽然我同意它是
touchesMoved问题的解决方法,但我的问题是关于另一个问题 -
如果您有兴趣,即使苹果没有回复我的错误报告,但我确实看到我的报告是重复的。所以有人已经做了报告,苹果必须意识到这一点。如果我有进一步的消息会报告。
标签: ios objective-c iphone sprite-kit touchesbegan