4

我只是第一次学习一些基本的 Objective-C 和 iOS 开发,所以请多多包涵。我非常熟悉其他语言的 lambdas 概念,但这是我第一次使用 Objective-C 块。

所以,按照 UIKit 动画教程,我想我会通过动画背景颜色来扩展它。我写了这个:

- (void) setBG: (float)r g:(float)g b:(float)b duration:(float)secs
{
    [UIView animateWithDuration:secs delay:0.0 options:0
                     animations:^{
                         [self setBackgroundColor: [UIColor colorWithRed:r green:g blue:b alpha:1.0]];
                     }
                     completion:nil];
}

所以,我预计需要以某种方式告诉animateWithDuration哪些变量需要动画。我从一个为位置(so、x 和 y)设置动画的示例开始,并认为我可能需要对 3 个变量进行动画处理。

然而,令我惊讶的是,这“刚刚奏效”。不知何故,语言似乎已经自动确定我想要动画r,gb. 编译器实际上是否在自省该块?这里发生了什么?如何animateWithDuration知道我希望它随着时间的推移修改哪些变量?

提前致谢。

4

3 回答 3

2

编译器不会以这种方式解释您的代码。这完全由UIView班级完成。

我显然不知道确切的内部实现,但一种可能的方法是shouldAnimateUIView. 类animateWithDuration:...方法可以在执行您传递的动画块之前打开此标志。a 的动画属性的 setter 方法UIView可能会检查这个标志来决定它是否需要动画:

- (void)setBackgroundColor:(UIColor *)newColor {
    if (shouldAnimate) {
        // set up and start animation.
    } else {
        _backgroundColor = newColor;  // just set without animating.
    }
    [self setNeedsDisplay];
}

执行完动画块后,animateWithDuration:...finally 会再次关闭该标志,因此当您UIView在动画块之外设置任何属性时,它不会被动画化。

于 2012-12-14T17:32:06.790 回答
2

该类UIView具有跟踪您是否在动画块内以及动画参数是什么的私有变量。

各种UIView属性的设置器检查该状态。如果 setter 发现它在动画块内被调用,它会为该属性创建一个动画。(动画是CABasicAnimation附加视图层的一个实例。)

UIView 类参考中列出了动画属性:

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch
于 2012-12-14T19:44:26.213 回答
0

UIView animateWithDuration在开始状态(原始值)和结束状态(您在动画块中设置的值)之间使用线性插值。想象一下变量值随时间变化的图表。使用所需的持续时间和两个点,它在(0 秒,起始值)和(持续时间,结束值)之间创建一条线。随着动画的播放,值会根据沿线随时间移动的点进行更新。

所以,我相信颜色被分解成值(rgb 是一个合乎逻辑的猜测)。我们有每个元素的开始值和结束值,它会随着动画持续时间而变化。

于 2012-12-14T19:38:00.257 回答