如何获得我想要的动画?

时间:2015-04-16 22:24:42

标签: ios swift animation

我想做一些测试。我想,让我们为UITableView中的一个单元格制作动画,例如:它从正常大小开始,在正常大小上水平扩展一点,在正常大小下水平缩小一点并恢复正常尺寸。所以我想这样做:

let width = cell.frame.size.width

cell.frame = CGRectMake(0, cell.frame.origin.y, width, cell.frame.size.height)

UIView.animateWithDuration(4.25, animations: {
    cell.frame = CGRectMake(width * -1/8, cell.frame.origin.y, width * 5/4, cell.frame.size.height)
    }, completion: { finished in
        UIView.animateWithDuration(2.5, animations: {
            cell.frame = CGRectMake(width * 1/8, cell.frame.origin.y, width * 3/4, cell.frame.size.height)
            }, completion: { finished in
                UIView.animateWithDuration(1.25) {
                    cell.frame = CGRectMake(0, cell.frame.origin.y, width, cell.frame.size.height)
                }
        })
})

在级联中使用动画和完成。问题是在一开始。框架水平快速缩小(而不是扩展),然后缓慢(4.25秒)扩展到正常大小。然后它会减少,然后按预期恢复正常。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

我实际上正在摆弄动画,就像你刚刚做的那样:)

您可以更轻松地完成水平效果;您可以简单地调整单元格的水平边界,而不是重新定义框架本身:

cell.bounds.size.width += 30 //grow it horizontally by 30 points

处理这个问题还有一个更简洁的方法:UIView.animateKeyframesWithDuration(_ delay: options: animations: completion:)

使用animateKeyframes,您可以按顺序将不同动画效果的列表串起来,这就是您想要的。我会开始你的:

UIView.animateKeyframesWithDuration(4.0, delay: 0.0, options: nil, animations: { 
    UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.25, animations: {
        self.cell.bounds.size.width += 30
    })
    UIView.addKeyframeWithRelativeStartTime(2.5, relativeDuration: 0.1, animations: {
        self.cell.bounds.size.width -= 60
    })
    UIView.addKeyframeWithRelativeStartTime(3.0, relativeDuration: 0.1, animations: {
        self.cell.bounds.size.width += 30
    })
}, completion: nil)

简单地说,您可以定义动画发生的持续时间。对于上面的代码示例,我定义了4秒。

在4秒内,我定义了3种不同的动画,指定它们应该在什么时间触发,以及它们应该被触发多长时间(relativeDuration,相对于4.0秒的值)。

调整这些数字可以自定义时间。

希望有效!