无法使用 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 中为 UILabel 中的递增数字设置动画

无法在 Swift 中使用时间延迟为 UIImage 设置动画

无法使用 animator() [ OSX ] 为 Swift 自定义属性设置动画

如何使用自动布局约束为移动 UILabel 设置动画?

使用 UIViewPropertyAnimator 为 UILabel textColor 属性设置动画