Swift:在UIImageView上制作动画约束

时间:2015-05-26 00:26:01

标签: ios swift animation autolayout

有几个回答的问题与我的问题相似,但是,它们似乎都没有解决我的困境。我有一个UIImageView,我通过更改水平和垂直UILongPressGesture移动constraints移动屏幕。如果image没有达到一定的距离,我希望它能够动画回到原来的位置。我使用以下是我用来尝试执行此操作的代码的示例:

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动画回到原来的位置而不是平滑过渡,它会立即进行到原来的位置,根本没有动画。根据类似问题的其他答案,我设置约束,然后在layoutIfNeeded中调用animateWithDuration

autolayout是否有遗漏?

我需要更改什么才能让image动画回到原来的位置?

1 个答案:

答案 0 :(得分: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

那些不是局部变量,那么它们是什么?也许设置它们有副作用,你没有考虑到。