我有一个名为specialLayer
. 像这样禁用不透明度的隐式动画:
self.specialLayer.actions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNull null], @"opacity", nil];
只有两种方法可以访问这个子层。
- (void)touchDown {
self.specialLayer.opacity = 0.25f;
}
- (void)touchUp {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.fromValue = [NSNumber numberWithFloat:self.specialLayer.opacity];
animation.toValue = [NSNumber numberWithFloat:1.0];
animation.duration = 0.5;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[self.specialLayer addAnimation:animation forKey:@"opacity"];
}
有时候是这样的:
1)用户按下按钮(按住)并调用 -touchDown 。specialLayer 的不透明度瞬间变为 0.25
2) 用户释放按钮并调用 -touchUp。specialLayer 的不透明度动画回到 1.0
此序列仅适用一次!
3)用户再次按下按钮(按住)并调用 -touchDown 。但是specialLayer的不透明度在屏幕上没有改变!即使self.specialLayer.opacity = 0.25f;
被调用也没有任何反应。不透明度似乎保持在 1.0f。
4)用户抬起手指并调用-touchUp。specialLayer 的不透明度跳到 0.25 并从那里动画到 1.0f。
我检查了 NSLog 以确保按此顺序调用方法。他们是这样。
当我取消注释动画代码并将不透明度直接设置为 1.0 时,后续直接不透明度更改立即生效。绝对是导致问题的 CABasicAnimation。删除禁用隐式动画的代码对此问题没有影响。
我一生都无法弄清楚这里发生了什么。为什么 CALayer 在我为不透明度添加 CABasicAnimation 后一段时间后没有反映我设置的不透明度值?这是一个错误吗?
我究竟做错了什么?