0

我想鎖定我的圖像我正在將(objectDragging)拖動到x或y中心,具體取決於我移動或影響其移動的方式。如果我將它影響到右側,我希望它鎖定在其最初的Y位置,並且只允許它向右(或左後方,直線)移動。如果我向上影響它,鎖定它的x位置並允許它在確切的線上向上或向下移動。我爲我的移動處理使用了一個開關,在.end的情況下有很多代碼,所以我不想包含很多代碼。只是希望有一個想法 - 無法找到很多。從平移手勢切割對角線運動

switch(recognizer.state) { 

    objectDragging = (recognizer.view?.tag)! 

    case .began: 

     initPosx = Int(recognizer.view!.center.x) 
     initPosy = Int(recognizer.view!.center.y) 
    case .changed: 
     ... 
+0

你還沒有明確說明你想要做什麼。您是否希望能夠自動決定用戶是在做一個大體上上下的手勢還是大部分的側面手勢,然後將運動鎖定到該維度?或者還有其他一些因素決定用戶是將物體左右移動還是上下移動? –

+0

對不起,我的帖子有點含糊。我的所有圖像都是UserInteractionEnabled,並隨時隨地移動到其中。我想確定用戶開始拖動它們的方式,然後將其鎖定在該方向的直線上或該平面上。類似於移動集合視圖單元格。 – idlehand

+0

您可以嘗試檢查初始的「速度」,並確定它是否爲大多數水平或大部分垂直的平移,然後設置一個標記,以便您可以在將來的平移事件中忽略其中一個軸。 – Paulw11

回答

0

使用velocityPaulw11我已經成功限制我移動圖像的方向的建議後,決定通過何種方式,我們最初移動圖像(.began),然後鎖定X或y(in .changed)。 Incase任何人都遇到類似的問題,繼承人我的解決方案的要點,對我的應用程序運行良好:

switch(recognizer.state) { 
case .began: 
let velocity = recognizer.velocity(in: self.view) 
if (velocity.x > velocity.y) && (velocity.x > 0) { 
      print("moving right") 
      myBlocks[objectDragging].center.y = CGFloat(initPosy) 
      movingRight = true 
     } 
     else if ((abs(velocity.x)) > velocity.y) && (velocity.x < 0) { 
      print("moving left") 
      myBlocks[objectDragging].center.y = CGFloat(initPosy) 
      movingLeft = true 
     } 
     else if (velocity.y > velocity.x) && (velocity.y > 0) { 
      print("moving down") 
      myBlocks[objectDragging].center.x = CGFloat(initPosx) 
      movingDown = true 
     } 
     else if ((abs(velocity.y)) > velocity.x) && (velocity.y < 0){ 
      print("moving up") 
      myBlocks[objectDragging].center.x = CGFloat(initPosx) 
      print(abs(velocity.y)) 
      movingUp = true 
     } 


    case .changed: 

     if (movingRight == true) { 
      myBlocks[objectDragging].center.y = CGFloat(initPosy) 
     } 
     else if (movingLeft == true) { 
      myBlocks[objectDragging].center.y = CGFloat(initPosy) 
     } 
     else if (movingDown == true) { 
      myBlocks[objectDragging].center.x = CGFloat(initPosx) 
     } 
     else if (movingUp == true) { 
      myBlocks[objectDragging].center.x = CGFloat(initPosx) 
     } 

    case .ended: 

     movingUp = false 
     movingLeft = false 
     movingRight = false 
     movingDown = false