2016-03-11 97 views
1

我有一個由按鈕觸發的SCNNodes動畫。在隨後按下按鈕時,動畫反轉。前進動畫總是可以正常工作,但反向動畫有時會掛起。也就是說,它將播放完成處理程序之前的部分然後凍結。但是,當我應用我的三種手勢(平移,平移,縮放)中的任何一種時,它都會掛起並完成處理程序部分。相關代碼:SCNAction完成處理程序等待手勢執行

  else if buttonToggle_1 == true { buttonToggle_1 = false 
       let moveWaterBack = SCNAction.moveTo(homePosition_2, duration: 1) 
       let moveValineBack = SCNAction.moveTo(awayPosition_1, duration: 1) 

       atomsNode_3.hidden = false 
       bondsNode_3.hidden = false 

       hideTransients(true) 

       atomsNode_3.runAction(moveWaterBack) 
       bondsNode_3.runAction(moveWaterBack, 
        completionHandler: { 
         self.atomsNode_2.runAction(moveValineBack) ; 
         self.bondsNode_2.runAction(moveValineBack) ; 
         self.atomsNode_3.removeFromParentNode() ; 
         self.bondsNode_3.removeFromParentNode() ; 
         hideTransients(false) 
        }) 
      } 

hideTransients())通話取消隱藏五個節點,通過名字來訪問它們。有時完成掛起,有時不完成。但是,如果它掛在同一頁上剩餘的特定會話中,它將繼續在後續按鈕切換時掛起。我還沒有找到任何因果關係。我已將removeFromParentNode()呼叫更改爲hidden = true,目前該功能正在運行,但讓我緊張依賴。

這裏可能會發生什麼?

編輯1:雖然它一直工作得非常一致,但我使用後面提到的代碼看到了幾次(多出)的掛斷,所以這不是嚴格歸因於removeFromParentNode()調用。

回答

1

在一個動作中調用SCNNode.removeFromParentNode()對我來說似乎很腥。我看到另外一個案例,這似乎是造成不穩定的行爲,雖然沒有文件證明你不應該這樣做。

我認爲SCNAction.removeFromParentNode()的存在是一個很大的提示,並且調用該操作將優於直接操作節點樹。

使用SCNAction.group()SCNAction.sequence()會使您的代碼更簡單一些。

+0

據我所知,'runAction()'只作用於單個節點。我的處理程序在4個不同的對象上執行操作,因此分組將無法工作。類似的情況使用'SCNAction.sequence()'。一旦第一對同時動作完成,我需要同時運行處理程序中的所有對象,不同的對象。我錯過了什麼嗎? (順便說一句,原子和債券保持分開是有原因的。)謝謝,哈爾。 – bpedit