有几个回答的问题与我的问题相似,但是,它们似乎都没有解决我的困境。我有一个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.x
和location.y
在其他位置定义为用户点击的位置
translation.x
和translation.y
被定义为用户在超级视图中的位置
毋庸置疑,在平移image
时一切正常。它会拖动,然后在手势结束时停止。问题是如果用户没有将image
拖过某个位置,我希望image
动画回到原来的位置而不是平滑过渡,它会立即进行到原来的位置,根本没有动画。根据类似问题的其他答案,我设置约束,然后在layoutIfNeeded
中调用animateWithDuration
。
autolayout
是否有遗漏?
我需要更改什么才能让image
动画回到原来的位置?
答案 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
那些不是局部变量,那么它们是什么?也许设置它们有副作用,你没有考虑到。