2016-09-14 89 views
2

我最近更新到iOS10和Swift 3.並且知道,每當我運行我的應用程序在iOS10設備(iPhone6s在我的情況)有一個隨機發生的touchesBegan函數的延遲。有時,這是伴隨着以下錯誤消息:奇怪的延遲touchesBegan在iOS 10

「的手勢:失敗之前 一個觸摸接收系統的姿勢狀態通知」

有趣的是我的大iPhone5s運行iOS9不會重現這個問題。

+2

我在iOS10中遇到過一些3D觸摸相關的問題。出於好奇,如果您在設備的「常規」 - >「輔助功能」中禁用3D觸摸,問題會消失嗎? – Columbo

+0

@Columbo其實!我剛剛關閉了3D觸摸,問題就停止了。事情是,它只發生在屏幕的左下方,所以我只是假設我的設備有問題。希望這只是一個軟件問題。 – NJanf

+0

您可能最好的選擇是向Apple提交錯誤報告。 – Columbo

回答

1

iOS上的奇怪UI延遲通常與線程有關。 iOS和Mac上與UI相關的方法都只能從主線程調用。由於API變得高度異步,許多方法都採用了塊回調,因此很容易在後臺線程中意外執行某些與UI相關的操作。

確保任何UI相關的活動,無論是更新圖像,文本字段,重新加載表視圖等,都始終從主線程完成。如果您在塊中執行UI,可以將UI部件包裝在dispatch_async(dispatch_get_main_queue(),...)中。

我是我的經驗,對這些方法之一的無意後臺線程調用可能會產生「中毒井」的效果,導致隨後的奇怪現象,例如您看到的延遲觸摸事件。

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 
     } 
    } 
0

我今天就遇到了這個問題,但也許換一個不同的原因。我的場景涉及在實現touchesBegan的視圖的超級視圖上使用UITapGestureRecognizer。由於UITapGestureRecognizer正在識別輕擊,並且由於輕敲識別器上的cancellsTouchesInView的默認值爲YES,因此一旦識別器識別出輕觸,視圖就不會獲得任何觸摸回調。但是,如果我觸摸並按住,則UITapGestureRecognizer無法識別觸摸,然後視圖將獲得回調。這導致看起來像延遲調用touchesBegan。

我也注意到,作爲調查的一部分,UIButtons在這裏得到了特殊的處理。如果一個UITapGestureRecognizer正在使用,它將不會考慮觸及UIButtons。