【问题标题】:Animating several consecutive UILabels at the same speed at the same time to the same point以相同的速度同时将多个连续的 UILabel 动画到同一点
【发布时间】:2015-08-13 08:23:09
【问题描述】:

我有 5 个连续的 UILabel 像这样:

它们是使用与标签 1 相同的框架创建的,然后使用 CGAffineTransform 属性移动。所以CGAffineTransformIdentity 会将它们全部带回标签1 的顶部。

我希望,当我按下按钮时,以相同的速度将它们全部移回标签1,一旦它们到达目的地,就将它们从超级视图中删除。

到目前为止,我已经完成了以下操作,但它不起作用:

var reversedLabels = getLabels().reverse()
let duration: NSTimeInterval = 5
UIView.animateWithDuration(duration, animations: {
    for (index, label) in enumerate(reversedLabels) {
        let relativeDuration: NSTimeInterval = duration * Double(index) / Double(reversedLabels.count)

        UIView.animateWithDuration(relativeDuration, animations: {
            label.transform = CGAffineTransformIdentity
            }, completion: { finished in
                label.hidden = true
        })
    }
    }, completion: { finished in
        for (index, label) in enumerate(reversedLabels) {
            label.removeFromSuperview()
        }
})

主动画的完成在嵌套动画的完成之前被调用。那我想这不是办法。

你会怎么做? (为什么最后没有调用“最终”完成?)

【问题讨论】:

    标签: ios swift core-animation uiviewanimation


    【解决方案1】:

    由于您没有为第一个动画块内的任何视图的任何可动画属性设置动画,因此完成块将在动画开始后立即执行。我无法理解的是你为什么需要那个块。在完成内部动画时,您将隐藏标签,这与从超级视图中删除它们的 UI 行为相同,所以也许这段代码(没有外部动画)可能会给您带来想要的结果

    for (index, label) in enumerate(reversedLabels) {
    
        let relativeDuration: NSTimeInterval = duration * Double(index) / Double(reversedLabels.count)
    
        UIView.animateWithDuration(relativeDuration, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: {
    
                label.transform = CGAffineTransformIdentity
    
                }, completion: {finished in
                label.removeFromSuperview()=
            })
    }
    

    已编辑:relativeDuration 应该通过将 +1 添加到索引来计算,否则第一个动画的持续时间为 0。此外,要使所有动画达到相同的速度,您应该使用UIViewAnimationOptions.CurveLinear

    【讨论】:

    • 好的我明白为什么它直接进入完成块。仅使用内部块执行此操作的问题是它们都一起开始(这很好),但它们都在相同的时间内到达同一个地点(这很好),因此速度不同。
    • 我还是不太清楚你的要求。您要先启动动画标签 5,然后在标签 5 在标签 4 的顶部之后启动动画标签 4 到标签 3 的顶部吗?
    • 不,我想将它们全部一起启动,并在它们位于标签 1 之上时结束它们。但我希望它们具有相同的速度,就像 5 跟随 4 一样正在关注 3 等等。但是对于这个块,由于持续时间相同但距离不同,5 会比 4 快,4 会比 3 快,依此类推。
    • 实际上添加 +1 会在动画中产生一个小的变化,它们不会以完全相同的速度移动,而且我正在寻找第一个持续时间为 0 的动画。谢谢,.CurveLinear 工作。我不知道。
    • 删除了 +1,我用 5 个标签尝试了你的示例,但其中只有 4 个在数组中,这就是需要 +1 的原因
    猜你喜欢
    • 2012-02-04
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多