Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios7 iOS中长时间运行的动画(最多1/2小时)_Ios7_Core Animation - Fatal编程技术网

Ios7 iOS中长时间运行的动画(最多1/2小时)

Ios7 iOS中长时间运行的动画(最多1/2小时),ios7,core-animation,Ios7,Core Animation,现在我有了动画饼图。例如,它可以指示一段时间内的进度(类似于UIProgressView) 出于传统原因,我仍在使用它的计时器,它大约每秒触发一次,并增加进度。现在应该可以取消此计时器并将饼图动画的总持续时间设置为1/2小时,而不是让计时器触发30*60次并启动尽可能多的短增量动画 所以我的问题是:有什么好的理由反对在iOS中使用如此长(比如长达1/2小时)的动画?在饼图示例中,即使超过1/2小时,也不需要超过360帧。有一个很好的理由反对使用很长的动画:内存。 CoreAnimation将为每

现在我有了动画饼图。例如,它可以指示一段时间内的进度(类似于
UIProgressView

出于传统原因,我仍在使用它的计时器,它大约每秒触发一次,并增加
进度
。现在应该可以取消此计时器并将饼图动画的总持续时间设置为1/2小时,而不是让计时器触发30*60次并启动尽可能多的短增量动画


所以我的问题是:有什么好的理由反对在iOS中使用如此长(比如长达1/2小时)的动画?在饼图示例中,即使超过1/2小时,也不需要超过360帧。

有一个很好的理由反对使用很长的动画:内存。
CoreAnimation
将为每一帧创建一个
presentationLayer
(参见示例),并且(至少在iOS 7.1之前)在将动画添加到层时,它将在后台分配和初始化它们

帧速率取决于设备,而不是动画特性变化的幅度;此外,似乎没有办法在iOS上调整
CoreAnimation
的帧速率(而在OSX上有
frameRate
属性),因此如果你设置
进度的动画(但对于任何属性都是一样的)并将持续时间设置为30分钟,你最终会浪费大量内存

一些数字。我在您的
DZRoundProgressLayer
上安排了一些路径为
progress
Cabasicanization
s,并添加了一些登录
-initWithLayer:
。这表明在模拟器上,每秒动画大约需要50个阴影副本(帧)。
这意味着将在30分钟内创建90K卷影副本:在动画开始后的几秒钟内,
CoreAnimation
仍在分配前数千个副本。将一些数据有效负载添加到
DZRoundProgressLayer
的实例变量中,显示内存使用量在最初几秒钟内增加了几MB(然后一些内存管理接管了无约束的分配,可能释放了旧拷贝)


这是一个坏主意吗?考虑到每帧饼图区域的变化太小以至于无法注意到,即使您的层在内存中占用了几个字节,这也是对资源、内存和CPU的浪费。设置
NSTimer
或KVO不需要很多行代码,因此可能值得更改方法。

如果它运行那么长时间,为什么不观察进度并在更改时重新绘制?听起来它不应该经常出现。@DavidRönnqvist用KVO观察,并在变化时重新绘制?这不是核心动画在内部所做的吗?我有兴趣在我的饼图视图中添加动画支持,以通过(短)动画重置其进度。因此,我现在想知道我是否可以使用相同的机制来支持更长的动画(从而删除
NSTimer
周围的一些可能冗余的代码),这似乎是可行的;如果这是一个坏主意,那么请解释为什么?+1好的,那就很好了:“帧速率取决于设备”。(我想我可以自己设置,也就是长时间运行的动画设置得很低。)Thx,特别是定量证据。不幸的是,在iOS上,帧速率是由
CoreAnimation
决定的。我们可以合理地假设它与显示器的刷新率同步(就像在iOS 5推出
GLKView
之前,您必须使用OpenGL)。我是否可以再问一个与动画相关的核心后续问题:是否可以配置“到现在为止可设置动画的自定义属性”
progress
,以便在
ui视图animateWithDuration:animations:
中从动画块调用时设置动画,否则不设置动画(或者可能设置动画的持续时间为零)?如有必要,我可以将此作为一个单独的问题发布。它已经得到了回答:;如果不修改用于传递
duration
参数的机制(例如,通过覆盖
+animateWithDuration:animations:
),则无法执行此操作。