`touchesBegan:withEvent:`在屏幕左边延迟

我遇到一个问题,当你触摸屏幕的左边缘时,第一次调用touchesBegan:withEvent:UIViewUIViewController被延迟。 这似乎是iOS 10的一个新问题,只发生在具有3D Touch(iPhone 6s和更新版本)的设备上。 事实上,如果您在General-> Accessibility中禁用3D Touch,问题就会消失。

但是,使用UIGestureRecognizers时似乎不会发生此问题。 我目前的解决方法是创建一个UIGestureRecognizer子类,它覆盖touches*方法并将它们转发给我的旧实现。

这只是一个错误还是有办法摆脱延迟?

尝试将此添加到viewdidappear方法。 这可能会解决问题。 它也发生在我身上,但我从堆栈溢出中得到了这个代码来解决我的问题。 希望它也能帮到你

 let window = view.window! let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer gr0.delaysTouchesBegan = false gr1.delaysTouchesBegan = false 

Purteeek解决方案似乎也适用于我的情况。 这是SpriteKit的Objective-C实现:

 - (void)didMoveToView:(SKView *)view { UIGestureRecognizer* gr0 = view.window.gestureRecognizers[0]; UIGestureRecognizer* gr1 = view.window.gestureRecognizers[1]; gr0.delaysTouchesBegan = false; gr1.delaysTouchesBegan = false; } 

这不会与其他手势识别器混淆,系统3D Touch仍然可以正常工作。 我想知道为什么这不是默认行为。

就像danialias我正在做一个游戏。 我发现的解决方案(目前正在使用支持3D Touch的iPhone上进行测试,到目前为止这是一个真正的问题……)适用于这两款游戏/应用:

似乎UITapGestureRecognizer不会受到此延迟的影响,因此只需在视图中添加一个,然后使用它来处理点击。

在我的游戏中,我存储触摸并在每次间隔更新时处理它们,所以我覆盖了

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

在那里我存储了UITouch实例并返回NO。

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { [self.touches addObject:touch]; return NO; }