gpt4 book ai didi

objective-c - animateWithDuration 如何知道要为什么设置动画?

转载 作者:可可西里 更新时间:2023-11-01 05:41:49 26 4
gpt4 key购买 nike

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

所以,按照 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 哪些变量需要设置动画。我从一个动画位置(例如,x 和 y)的示例开始,并认为我可能需要做一些更改来动画 3 个变量。

然而,令我惊讶的是,这“奏效了”。语言似乎以某种方式自动确定我想要为 rgb 设置动画。编译器真的在自省(introspection)这个 block 吗?这里发生了什么? animateWithDuration 如何知道我希望它随时间修改哪些变量?

提前致谢。

最佳答案

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

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

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

执行动画 block 后,animateWithDuration:... 最终再次关闭该标志,因此当您在动画 block 外设置任何 UIView 属性时,它不会动画。

关于objective-c - animateWithDuration 如何知道要为什么设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com