我最近更新到iOS10和Swift 3.并且知道,每当我在iOS10设备上运行我的应用程序(在我的情况下是iPhone6s)时,touchesBegan函数会随机出现延迟。有时这会伴随以下错误消息:
“手势:之前无法接收系统手势状态通知 下次触摸“
有趣的是,运行iOS9的旧版iPhone5无法重现此问题。
答案 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。