2016-10-02 133 views
4

我在遇到一个问题,即当您触摸屏幕左边缘时,第一次调用touchesBegan:withEvent:UIViewUIViewController会延迟。这似乎是iOS 10的一个新问题,并且只发生在使用3D Touch(iPhone 6s和更新版本)的设备上。事实上,如果您在“常规” - >“辅助功能”中禁用3D Touch,问题就会消失。`touchesBegan:withEvent:`在屏幕左边缘延迟了

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

这只是一个错误,或者有没有办法摆脱延迟?

回答

5

尝试将此添加到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 
+0

嗯我看到,将如何解决眼前的问题,但与系统手势识别搞乱好像它会导致更多的问题上下行 – Jayson

+0

我没有更多的一些调查,这似乎是目前最佳的解决方案。 这些手势识别器是'_UISystemGestureGateGestureRecognizer'的实例,似乎主要用于确保您的应用与系统手势(如控制中心或3D触摸应用切换)更好地交互。对于左边缘,我认为延迟是为了防止用户在尝试切换应用程序时意外的应用程序交互而产生的,但在我的情况下,我需要在左侧边缘进行响应式触摸,并且在用户尝试切换应用程序时触摸触发。 – Jayson

1

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触控仍然正常工作。我想知道为什么这不是默认行为。

+0

此修补程序不再有效... – alasker

0

像danialias我正在一个游戏。我发现的解决方案(目前正在开发中,已经在支持3D Touch的iPhone上进行测试,在这一点上这是一个真正的问题..)适用于这两种游戏/应用程序:

看起来UITapGestureRecognizer不会遭受这个延迟,所以简单地添加一个到你的视图,并用它来处理水龙头。

在我的游戏,我倒是存储和处理他们在每个时间间隔更新,所以我推翻

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

在那里我存储在UITouch实例,并没有返回。

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