在iOS 10中使用touchesBegan导致奇怪的延迟

时间:2016-09-14 14:15:12

标签: ios swift ios10

我最近更新到iOS10和Swift 3.并且知道,每当我在iOS10设备上运行我的应用程序(在我的情况下是iPhone6s)时,touchesBegan函数会随机出现延迟。有时这会伴随以下错误消息:

  

“手势:之前无法接收系统手势状态通知   下次触摸“

有趣的是,运行iOS9的旧版iPhone5无法重现此问题。

3 个答案:

答案 0 :(得分:0)

iOS上通常奇怪的UI延迟与线程有关。 iOS和Mac上的UI相关方法都只能从主线程调用。由于API变得高度异步,许多方法采用块回调,因此很容易意外地从后台线程执行与UI相关的操作。

确保任何与UI相关的活动,无论是更新图像,文本字段,重新加载表格视图等,都始终从主线程完成。如果你在一个块中做UI内容,你可以将UI部分包装在dispatch_async(dispatch_get_main_queue(),...)中。

我是我的经验,对这些方法之一的无意中背景线程调用会产生“中毒井”的效果,导致后续的怪异,例如您所看到的延迟触摸事件。

答案 1 :(得分:0)

我有同样的问题,我模拟触摸并按住左右转向一辆车。以下是为我修复它的原因。

更改以下内容:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let location = touch.location(in: self)
        let node: SKNode = atPoint(location)

        if node == self.player1CarRight {
                self.player1CarRotateRightTouching = true
        }
    }
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch:UITouch = touches.first! as UITouch
    let touchLocation = touch.location(in: self)

    if player1CarRight.contains(touchLocation) {
        self.player1CarRotateRightTouching = true;
    }
}

touchesEnded的相同变化:

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
       let touch:UITouch = touches.first! as UITouch
       let touchLocation = touch.location(in: self)

        if player1CarRight.contains(touchLocation) {
            self.player1CarRotateRightTouching = false
        }
    }

答案 2 :(得分:0)

我今天遇到了这种行为,但也许是出于其他原因。我的方案涉及在实现touchesBegan的视图的超级视图上有一个UITapGestureRecognizer。由于UITapGestureRecognizer正在识别点击,并且由于点击识别器上的cancelsTouchesInView的默认值为YES,因此一旦识别器识别出触摸,则视图不会获得任何触摸回调。但是,如果我触摸并按住,UITapGestureRecognizer无法识别触摸,然后视图将获得回调。这导致看起来像是对touchesBegan的延迟调用。

我还注意到,作为调查的一部分,UIButtons在这里得到特殊待遇。如果正在使用UITapGestureRecognizer,它将不会考虑触摸UIButtons。