无法使用 Swift 为 UILabel 设置动画
Posted
技术标签:
【中文标题】无法使用 Swift 为 UILabel 设置动画【英文标题】:Can't animate UILabels with Swift 【发布时间】:2014-08-14 15:58:35 【问题描述】:我正在尝试为视图上的标签设置动画。我想显示标签 1,然后显示标签 2,然后删除标签 2。但是 label2 总是被删除。如果我删除最后一个关键帧块(“删除”label2),它会正确显示)。
代码如下:
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
let pos1 = self.label1.frame
let pos2 = self.label2.frame
self.label1.frame = CGRect(x: self.view.center.x, y: -10, width: 0, height: 0)
self.label2.frame = CGRect(x: pos2.origin.x, y: self.view.frame.height+10, width: 0, height: 0)
UIView.animateKeyframesWithDuration(1.5, delay: 0.0, options: nil, animations:
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.4, animations:
self.label1.frame = pos1
)
UIView.addKeyframeWithRelativeStartTime(0.4, relativeDuration: 0.4, animations:
self.label2.frame = pos2
)
UIView.addKeyframeWithRelativeStartTime(1.0, relativeDuration: 0.5, animations:
self.label1.frame = CGRect(x: pos2.origin.x, y: self.view.frame.height + 10, width: 0, height: 0)
)
, completion: nil)
【问题讨论】:
【参考方案1】:从reference 开始,addKeyframeWithRelativeStartTime...
中的时间参数是 0..1 范围内的值,它们相对于动画的整个持续时间进行解释,而不是以秒为单位的值。所以指定一个开始时间为 1.0 的关键帧表示在整个动画的 END 开始动画。将开始时间更改为 0.0 / 1.5、0.5 / 1.5、1.0 / 1.5,将持续时间更改为 0.4 / 1.5 和 0.5 / 1.5。
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
let pos1 = self.label1.frame
let pos2 = self.label2.frame
self.label1.frame = CGRect(x: self.view.center.x, y: -10, width: 0, height: 0)
self.label2.frame = CGRect(x: pos2.origin.x, y: self.view.frame.height + 10, width: 0, height: 0)
UIView.animateKeyframes(withDuration: 1.5, delay: 0.0, options: [], animations:
UIView.addKeyframe(withRelativeStartTime: 0.0 / 1.5, relativeDuration: 0.4 / 1.5, animations:
self.label1.frame = pos1
)
UIView.addKeyframe(withRelativeStartTime: 0.4 / 1.5, relativeDuration: 0.4 / 1.5, animations:
self.label2.frame = pos2
)
UIView.addKeyframe(withRelativeStartTime: 1.0 / 1.5, relativeDuration: 0.5 / 1.5, animations:
self.label1.frame = CGRect(x: pos2.origin.x, y: self.view.frame.height + 10, width: pos1.size.width, height: pos1.size.height)
)
, completion: nil)
似乎也存在动画视图大小的问题。仅使用最终大小(请注意,在这种情况下,您应该看到标签从 0x0 开始并增长到最终大小,但它们没有)因此将最终帧中的大小设置为 0x0 使 label1 通过整个动画。更改代码以保持大小,它似乎工作正常。如果您真的想将大小设置为零动画,您可能需要通过缩放为变换属性设置动画。
【讨论】:
是的,我的数学倒退了,现在应该可以了。使用relativeTime / totalTime
而不是relativeTime * totalTime
。
现在试试看,animateKeyFrames...
似乎没有(正确)动画frame.size
是的,是尺寸问题。谢谢!以上是关于无法使用 Swift 为 UILabel 设置动画的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 中为 UILabel 中的递增数字设置动画
无法在 Swift 中使用时间延迟为 UIImage 设置动画