无法使用Swift为UILabels制作动画

时间:2014-08-14 15:58:35

标签: ios swift uikit

我试图在视图上设置标签动画。我想显示标签1,然后标签2,然后删除label2。但是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 个答案:

答案 0 :(得分:2)

addKeyframeWithRelativeStartTime...中的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 / 1.5, relativeDuration: 0.4 / 1.5, animations: { self.label1.frame = pos1 }) UIView.addKeyframeWithRelativeStartTime(0.4 / 1.5, relativeDuration: 0.4 / 1.5, animations: { self.label2.frame = pos2 }) UIView.addKeyframeWithRelativeStartTime(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) } 中的时间参数是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。

{{1}}

似乎还存在动画视图大小的问题。仅使用最终大小(请注意,在这种情况下,您应该看到标签从0x0开始并增长到它们的最终大小,但它们没有。)因此,将最终帧中的大小设置为0x0会使label1具有该大小。整个动画。更改代码以保持大小,它似乎工作正常。如果你真的想要将大小设置为零,你可能需要通过缩放来为变换属性设置动画。