iOS动画块如何工作?

时间:2012-07-13 08:54:17

标签: ios core-animation objective-c-blocks

在iOS中,您可以animate view objects使用动画块:

[UIView animateWithDuration:1.0 animations:^{

        firstView.alpha = 0.0;

        secondView.alpha = 1.0;

}];

我们这里有一个代码块,它描述了动画完成后视图属性最终会看到的内容。

这是如何运作的?

我能理解(我认为)如果这是使用一些声明性格式完成的,但从它的外观来看,动画块只是一段常规代码,可能必须执行,结果检查然后有人转码进入执行动画的实际低级图形代码。

块是否实际执行(或以某种方式反向工程),如果是,何时?

如果在动画开始之前执行此代码,那么如何不立即反映对引用的视图属性的更改?

如果我将代码放在不改变视图属性的块中,但是执行其他操作会发生什么?

3 个答案:

答案 0 :(得分:8)

是的,实际调用了块 - 然后它立即更改了视图的属性。 UIView的属性设置器负责查看该组是否在动画上下文中使用 - 如果是这样,他们使用CoreAnimation和CoreGraphics计算动画帧等。

如果您将非动画代码放入这些块中,则不会发生任何特殊情况 - 该块将立即执行。

答案 1 :(得分:6)

查看块之前的等效代码是有益的:

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0];
firstView.alpha = 0.0;
secondView.alpha = 1.0;
[UIView commitAnimations];

所以你看,即使在块之前,还要直接设置要更改的属性;但是,它们不会立即生效(它们是动画的)。

它是如何工作的?大概是当你在视图上设置一个属性时,它会检查你是否运行beginAnimations而不是commitAnimations,如果是,则不会立即生效(而是将其添加到列表中动画制作动画的事情。)

所以块版本在pre-blocks版本的上下文中非常简单:您可以将其视为在beginAnimationscommitAnimations行内运行动画块。

答案 2 :(得分:1)

Apple并没有真正谈论它如何运作的细节,但这就是我认为发生的事情:

当视图添加到视图层次结构时,系统会在视图的所有可动画属性上添加KVO观察者。

当您的动画块执行时,系统会设置一个状态,以监视这些属性上的KVO通知。然后,调用的代码会创建相应的CAAnimation对象并将其添加到每个受影响的视图层。