iOS动画块如何工作?

Thi*_*ilo 8 core-animation ios objective-c-blocks

在iOS中,您可以使用动画块为视图对象设置动画:

[UIView animateWithDuration:1.0 animations:^{

        firstView.alpha = 0.0;

        secondView.alpha = 1.0;

}];
Run Code Online (Sandbox Code Playgroud)

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

这是如何运作的?

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

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

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

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

小智 8

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

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

  • 没有冲突:后者将是有效的,前者将被丢弃。 (2认同)

new*_*cct 6

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

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0];
firstView.alpha = 0.0;
secondView.alpha = 1.0;
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

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

它是如何工作的?据推测,当您在视图上设置属性时,它会检查您是否已运行,beginAnimations但如果是commitAnimations,则不会立即生效(而是将其添加到要为该动画制作动画的事物列表中).

所以块版本在预块版本的上下文中非常简单:您可以将其视为在内部beginAnimationscommitAnimations线条中运行动画块.