在iOS中,您可以animate view objects使用动画块:
[UIView animateWithDuration:1.0 animations:^{
firstView.alpha = 0.0;
secondView.alpha = 1.0;
}];
我们这里有一个代码块,它描述了动画完成后视图属性最终会看到的内容。
这是如何运作的?
我能理解(我认为)如果这是使用一些声明性格式完成的,但从它的外观来看,动画块只是一段常规代码,可能必须执行,结果检查然后有人转码进入执行动画的实际低级图形代码。
块是否实际执行(或以某种方式反向工程),如果是,何时?
如果在动画开始之前执行此代码,那么如何不立即反映对引用的视图属性的更改?
如果我将代码放在不改变视图属性的块中,但是执行其他操作会发生什么?
答案 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版本的上下文中非常简单:您可以将其视为在beginAnimations
和commitAnimations
行内运行动画块。
答案 2 :(得分:1)
Apple并没有真正谈论它如何运作的细节,但这就是我认为发生的事情:
当视图添加到视图层次结构时,系统会在视图的所有可动画属性上添加KVO观察者。
当您的动画块执行时,系统会设置一个状态,以监视这些属性上的KVO通知。然后,调用的代码会创建相应的CAAnimation对象并将其添加到每个受影响的视图层。