Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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
iOS动画块是如何工作的?_Ios_Core Animation_Objective C Blocks - Fatal编程技术网

iOS动画块是如何工作的?

iOS动画块是如何工作的?,ios,core-animation,objective-c-blocks,Ios,Core Animation,Objective C Blocks,在iOS中,可以使用动画块: [UIView animateWithDuration:1.0 animations:^{ firstView.alpha = 0.0; secondView.alpha = 1.0; }]; 我们这里有一个代码块,它描述了动画完成后视图属性的最终外观 这是怎么回事 我可以理解(我认为)如果这是使用某种声明性格式完成的,但从外观上看,动画块只是一段常规代码,可能必须执行,检查结果,然后有人将其转换为执行动画的实际低级图形代码

在iOS中,可以使用动画块:

[UIView animateWithDuration:1.0 animations:^{

        firstView.alpha = 0.0;

        secondView.alpha = 1.0;

}];
我们这里有一个代码块,它描述了动画完成后视图属性的最终外观

这是怎么回事

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

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

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


如果我把代码放在块中,它不改变视图属性,但做了其他事情,会发生什么

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


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

苹果并未真正谈论其工作原理的细节,但我认为会发生以下情况:

将视图添加到视图层次时,系统会在视图的所有可设置动画的属性上添加KVO观察者


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

在块之前查看等效代码是有指导意义的:

[UIView beginAnimations:@"foo" context:NULL];
[UIView setAnimationDuration:1.0];
firstView.alpha = 0.0;
secondView.alpha = 1.0;
[UIView commitAnimations];
因此,即使在块之前,也会直接设置要更改的属性;但是,它们不会立即生效(它们已设置动画)

它是如何工作的?假设在视图上设置属性时,它会检查您是否正在运行
beginAnimations
,而不是
commitAnimations
,如果正在运行,则不会立即生效(而是将其添加到要为该动画设置动画的内容列表中)


因此,在预块版本的上下文中,块版本的作用非常简单:您可以将其视为在
beginAnimations
commitAnimations
行中运行动画块。

Aha!所以在UIView内部,有一段代码检查调用堆栈,如果它是从动画块调用的,它会做一些完全不同于直接更新自身的事情?我不确定它会检查调用堆栈;它应该是设置某种内部上下文的动画方法。啊哈!但是UIView会检查此上下文并相应地执行操作?如果在同一块中调用同一属性两次会发生什么情况?还是有冲突的财产?说
firstView.alpha=0.0;firstView.alpha=0.25他们排队了吗?或者相互覆盖?没有冲突:后者将是有效的,前者将被丢弃。这将很好地将动画代码与视图实现分离。KVO观察器是否可以禁止设置属性(而不是队列动画)?另外,虽然苹果没有提到这一点,但有没有办法检查/检测正在运行的系统,看看会发生什么?您不需要禁止设置属性。核心动画通过显示表示层来完成,表示层独立于层的实际设置。事实上,对于动画对象,设置更改动画的方法之一是在不设置动画的情况下设置层的属性,然后提交一个为该更改设置动画的动画。动画完成后,将删除该动画,并在其最终状态下渲染该层。如果在不更改基础特性的情况下提交动画,则动画完成后,层将恢复到其原始状态。