不清楚为什么UIView.animate工作顺利,但代码在动画块之外

时间:2016-09-23 19:22:02

标签: ios swift animation uiview imageview

我是UIView动画的新手。我无法理解这种逻辑的执行。我创建了一个ImageView来保存图像,我添加了一个Tap Gesture Recognizer,将UIImageView设置为“User Interaction Enabled”&为该TGR召集IBAction。然后我点击图像时点击下面的功能。我们的目标是让图像“弹出”一个弹性动作,就像它被打孔一样,弹回到图像的原始边界,这样你就可以再次打击。它完全按照我的意愿工作(虽然我通常将withDuration设置为0.25,但我将其设置为10以更好地查看动画)。但是,我真的不明白为什么会这样。最后一行平滑地将图像的结束边界设置为原始边界大小(这是我想要的),但是它可以顺利地完成,即使它不是闭包中动画块的一部分。如果我消除了重置图像边界的最后一行,那么每次执行后图像将在每个方向上增长60像素(这是我所期望的)。我不明白的是:为什么函数中的最后一行self.imageToPunch.bounds = bounds,即使它不在闭包内,也能顺利地与动画块一起工作?

func animateImage() {

    // Create a variable holding the bounds of the image
    let bounds = self.imageToPunch.bounds

    // Setup and execute the animation
    UIView.animate(withDuration: 10.00, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: {
        self.imageToPunch.bounds = CGRect(x: bounds.origin.x - 60, y: bounds.origin.y - 60, width: bounds.size.width + 60, height: bounds.size.height + 60)

        }, completion: nil)

    // Reset the bounds of button so it doesn't grow (remember we spring 60 pixels from the corners)
    // self.imageToPunch.bounds = bounds
    self.imageToPunch.bounds = bounds
}

1 个答案:

答案 0 :(得分:0)

感谢您的建议,Björn。我不确定我是否按照你的建议实施,但它让我尝试了别的东西。通过缩小原始图像视图边界,然后动画返回到原始大小,这似乎产生相同的效果。代码如下,但我仍然非常想知道为什么原始代码受到UIView.animate语句之外的行的影响:

    // We'll use new constant bounds to hold the end state for the animation (imageToPunch's original bounds, or size rectangle)
    let bounds = self.imageToPunch.bounds

    // shrink imageToPunch by 60
    self.imageToPunch.bounds = CGRect(x: self.imageToPunch.bounds.origin.x + 60, y: self.imageToPunch.bounds.origin.y + 60, width: self.imageToPunch.bounds.size.width - 60, height: self.imageToPunch.bounds.size.height - 60)

    // animate image view out to the original size (saved in bounds) using a spring effect
    UIView.animate(withDuration: 0.25, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: {
        self.imageToPunch.bounds = bounds }, completion: nil )