在指定时间间隔内使用Swift将Double从0动画到1

4
我正在尝试通过传递进度指示器(Double),在指定的时间内连续调用函数,使该指示器从0变为1。在Swift中是否有一种“动画”这种从0到1的变化的方法?
更新: 以下是我根据https://github.com/danielgindi/ios-charts更新饼图数据的代码。
internal func animateDataChange(fromDataSet: PieChartDataSet, toDataSet: PieChartDataSet, progress: Double) -> PieChartDataSet {
    var dataEntries: [ChartDataEntry] = []
    for i in 0..<fromDataSet.yVals.count {
        let yValue = (toDataSet.yVals[i].value - fromDataSet.yVals[i].value) * progress + fromDataSet.yVals[i].value
        let dataEntry = ChartDataEntry(value: yValue, xIndex: i)
        dataEntries.append(dataEntry)
    }
    let animatedDataSet = PieChartDataSet(yVals: dataEntries, label: "")
    return animatedDataSet
}

我想要做的是对两个数据集之间的变化进行动画处理,变化的进度会反映在“progress”参数中。我需要不断调用该函数,直到“progress”等于1。

不是真的,你需要创建一个定时器,重复调用一个方法(比如每0.1秒),在该方法中计算它被调用的次数(1、2、3...次)。然后将“周期”和“次数”相乘。如需更多帮助,请发布你已经尝试过的内容! - luk2302
我想做的是基于ios-charts库在饼图中动画显示值分布的变化。我已经添加了相关函数的代码片段。 - Grzegorz Aperliński
请通过编辑问题在其中发布代码片段,而不是在评论中。 - luk2302
抱歉,我现在已经添加了我的代码。 - Grzegorz Aperliński
好的,我撤回之前的评论。你应该研究一下如何以所需方式对iOS图表进行动画处理,不要试图编写自己的动画,而是让框架为你完成工作。不幸的是,我没有使用过那个框架 - 因此无法帮助你。 - luk2302
感谢您的输入。不幸的是,似乎我只能通过动画来填充图表数据,但似乎没有内置的方法可以将给定数据集的数据更改动画化到另一个数据集。除非我漏掉了什么... - Grzegorz Aperliński
2个回答

2

我决定使用NSTimer,每0.01秒将计数器从0递增到1。我知道这可能不是最有效的方法,但它可以工作:

var progress: Double = 0
var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target:self, selector: Selector("updateProgress"), userInfo: nil, repeats: true)

func updateProgress() {
    guard progress <= 1 else {
        timer.invalidate()
        return
    }
    progress += 0.01
}

请问您可以更新特定数据集动画中整行代码,说明您如何使用这个“progress”值吗? - Arun Kumar
我不再能够访问该项目,但据我所记,我基本上为每个进度步骤创建了一个新的PieChartData实例,并将其分配给PieChartView的数据属性。更新之间的时间间隔产生了动画的错觉。非常hacky,但它起作用了。 - Grzegorz Aperliński

0
我会看一下CAKeyFrameAnimation,并将您想要动画化的Double值的文本存储在CATextLayer中。
您可以动画化CATextLayer的字符串值,因此您可以从一个字符串值动画到另一个字符串值。(我假设您想要动画化的Double正在某个地方以字符串形式呈现。)您可以重复动画,并在指定时间设置中间值。

谢谢!我已经决定使用NSTimer代替。 - Grzegorz Aperliński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接