【发布时间】:2012-06-24 01:57:42
【问题描述】:
我正在尝试为 CAGradientLayer 上的变换设置动画,但是无论我做什么,我似乎都无法进行更改。此代码运行后,图层仍然不可见(即 scale.y 仍为 0.0f)。
@implementation NickView
+(Class) layerClass {
return [CAGradientLayer class];
}
- (void) didMoveToWindow {
self.backgroundColor = [UIColor clearColor];
CAGradientLayer* gLayer = (CAGradientLayer*)self.layer;
[gLayer setColors:
[NSArray arrayWithObjects:
(id) [UIColor blackColor].CGColor,
(id) [UIColor redColor].CGColor,
(id) [UIColor blackColor].CGColor,
nil]];
gLayer.transform = CATransform3DMakeScale(1.0, 0.0f, 1.0f);
[self performSelector:@selector(doAnimation) withObject:nil afterDelay:3.0f];
}
- (void) doAnimation {
CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"transform.scale.y"];
a.delegate = self;
a.duration = 5.0f;
a.toValue = [NSNumber numberWithFloat:1.0f];
[self.layer addAnimation:a forKey:@"anim"];
}
}
有谁知道为什么这不会导致图层的 scale.y 被动画回 1?
【问题讨论】:
-
那是因为
CALayer没有名为transform.scale.y的属性 -
@ZeusAlexander 但它是一个非常有效的动画关键路径。再次阅读the documentation。
-
将 self.layer 转换为渐变层然后再进行动画处理是不是有点奇怪?我以为您会向其中添加自己的图层并通过 ivar 引用它。如果在 doAnimation 中设置断点并检查状态会发生什么?如果您改为为其他属性设置动画会发生什么?注意:显式动画永远不会改变实际值,所以在动画之后值会出现跳回原来的状态,这是你看到的吗?
-
我现在用一个子层尝试过这个,设置removedOnCompletion = NO以及fillMode为转发,产生相同的结果。如果我在第一种方法中注释掉明确设置变换的行,然后将动画更改为 0.0f,我会看到图层正确缩小。几乎就像手动设置变换会禁用图层上的所有动画一样。
标签: ios cocoa core-animation calayer