我想做一些测试。我想,让我们为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秒)扩展到正常大小。然后它会减少,然后按预期恢复正常。
我做错了吗?
答案 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秒的值)。
调整这些数字可以自定义时间。
希望有效!