2011-02-28 104 views
0

大家好 我试图了解块如何工作。iPhone块解释

[UIView animateWithDuration:1 animations:^{ 
blueViewController.view.alpha = 0; 
yellowViewController.view.alpha = 0; 
}]; 

我很想知道他们是如何实现这个过渡。正如我所看到的,将视图的alpha更新为0的块只能被执行,并且会导致即时更新而不是动画? 如果有人能向我解释他们是如何实现这个功能的话,它能够帮助我理解块的工作方式。

另外我觉得它有点奇怪,我创建的封闭块只创建只读变量。那么我如何能够更改alpha而不用“_ block”关键字来定义它?是否只有缩放器类型需要“_block”? (int/float ect)。

回答

2

魔术不是Block系统,它只是允许你创建和调用匿名函数。魔术是核心动画框架。

其基本原理是所有参数都立即应用,但Core Animation不会立即重新绘制所有内容,而是查找更改并将其应用于给定的动画持续时间。

查看Core Animation框架参考和WWDC 2010会话424和425以获取更深入的信息。

0

块只是一种回调,它可以传递给另一个范围,同时仍然可以访问局部变量,从它定义的范围。 这就是封闭。

你的问题似乎更关系到CoreAnimation ...

0

我觉得其他的答案覆盖块本身和核心动画和动画块(不同使用术语“块”的)之间的区别。

但是对于你关于捕获变量的问题,你得到的是指针'blueViewController'和'yellowViewController'的const副本。指针本身是常量拷贝,但是你使用这些指针来访问底层视图控制器对象来检索每个视图,然后发送每个视图 - [UIView setAlpha:]消息。

如果你把它拼出来,可能会更清楚。在您的区块内有:

UIView *view = [blueViewController view]; // <-- send view message to the const pointer 
[view setAlpha:0.0]; // <-- Now send a setAlpha message to the view 

blueViewController.view.alpha = 0.0只是上述的简写。

希望有所帮助。

0

您可以从块访问任何实例变量或全局变量。

[UIView animateWithDuration:1 animations:^{ 
blueViewController.view.alpha = blueViewController.myAlphaValue; 
yellowViewController.view.alpha = 0; 
}]; 

blueViewController和yellowViewController自动从块保留,因为这些都是Objective-C对象,它是安全的,从块存取,而不必担心实例的寿命。如果blueViewController和yellowViewController是ivar,那么块只会自动保留self。

__block存储类型修饰符也可以用于指针。

__block MyViewController *myViewController = self.viewController; 

但是,即使此变量是Objective-C对象,该变量也不会从块中自动保留。小心__block Objective-C对象的生命周期。

^{ 
    myViewController = self.viewController; 
    /* If myViewController is with __block modifier, it is ok. */ 
    /* If myViewController is without __block modifier, this line is not able to compile. */ 
}; 

The __block Storage Type