2015-05-26 102 views
2

有幾個回答的問題與我的相似,但是,它們都不能解決我的困境。我有一個UIImageView,我在屏幕上移動UILongPressGesture,我通過改變水平和垂直移動constraints。如果這個image沒有達到一定的距離,我希望它動畫回到原來的位置。我現在用的下面是我用的,試圖做到這一點的代碼示例:Swift:在UIImageView上製作動畫約束

if sender.state == UIGestureRecognizerState.Changed { 

    image1ConstraintX.constant = imageConstX + (translation.x - location.x) 
    image1ConstraintY.constant = imageConstY + (translation.y - location.y) 

} else if sender.state == UIGestureRecognizerState.Ended { 

    var xPosition = self.image1.frame.origin.x + image1.frame.width/2 
    var yPosition = self.image1.frame.origin.y + image1.frame.width/2 
    imageConstX = image1ConstraintX.constant 
    imageConstY = image1ConstraintY.constant 

    if xPosition < 215 && yPosition < 210 { 
     self.image1ConstraintX.constant = 13 
     self.image1ConstraintY.constant = 17 
     UIView.animateWithDuration(1.3, delay: 0.0, options: nil, animations: { 
        self.view.layoutIfNeeded() 

        }, completion: nil) 
      } 

location.xlocation.y在別處定義爲用戶點擊

translation.xtranslation.y位置被定義爲用戶在超級視圖中的位置

不用說,在平移image時一切正常。它拖動,然後在手勢結束時停止。問題是,如果用戶沒有將image拖動到特定位置,我想讓image回到其原始位置,而不是平滑過渡,它會立即回到原來的位置,而不是動畫。根據類似問題的其他答案,我將設置約束,然後在animateWithDuration中調用layoutIfNeeded

有什麼與autolayout我失蹤了嗎?

爲了讓image回到原來的位置,我需要更改什麼?

+0

抱歉,錯誤的答案我做了一個快速的研究和一些測試在這裏,我有它的工作,看看我的答案我再次爲你編輯它。 – Icaro

+0

你的更新答案應該可以工作,但是,由於某種原因,似乎任何時候一個'約束'被改變了'UIImageView'的位置在'animation'之外被更新。下面的@matt答案正在爲我工​​作。 – Ryguyu

回答

2

我還沒有測試過這個,但是在這些情況下,我的第一個衝動總是試圖延遲主線程。所以,首先,粘貼到您的文件中(在import之後,但在所有其他位置之前)delay實用程序,我給here。現在包裹在很短的延遲你的最後一種情況:

if xPosition < 215 && yPosition < 210 { 
    delay(0.1) { 
     self.image1ConstraintX.constant = 13 
     self.image1ConstraintY.constant = 17 
     UIView.animateWithDuration(1.3, delay: 0.0, options: nil, animations: { 
      self.view.layoutIfNeeded() 
     }, completion: nil) 
    } 
} 

如果不解決這個問題,那麼我的下一步行動將是想想這些行:

imageConstX = image1ConstraintX.constant 
imageConstY = image1ConstraintY.constant 

這些都不是局部變量,那麼它們是什麼?也許設置它們有副作用,你沒有考慮到。

+0

是的,這些是我在視圖加載並存儲原始X和Y'約束'時設置的變量。然後,一旦「手勢」結束,我就會更新這些內容。 – Ryguyu

+0

你試過我說的嗎? – matt

+0

剛剛嘗試過。有效!了不起。有什麼想法在幕後發生了什麼? – Ryguyu