我试图在视图上设置标签的动画。我想显示标签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)
}

最佳答案

reference开始,addKeyframeWithRelativeStartTime...中的计时参数是0..1范围内的值,这些值相对于动画的整个持续时间进行解释,而不是以秒为单位的值。因此,指定开始时间为1.0的关键帧表示在整个动画结束时开始动画。将“开始时间”更改为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在整个动画中都具有该大小。更改代码以保持大小,看起来工作正常。如果您真的想将大小设置为零,您可能需要通过缩放设置transform属性的动画。

关于ios - 无法使用Swift为UILabel设置动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25312503/

10-11 22:15
查看更多