というサブレイヤーを持つビューがありますspecialLayer
。不透明度の暗黙的なアニメーションは、次のように無効になります。
self.specialLayer.actions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNull null], @"opacity", nil];
このサブレイヤーにアクセスする方法は 2 つだけです。
- (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 に戻る
このシーケンスは 1 回だけ機能します。
3) ユーザーがもう一度ボタンを押して (保持)、-touchDown が呼び出されます。しかし、specialLayer の不透明度は画面上で変化しません! self.specialLayer.opacity = 0.25f;
呼び出されても何も起こりません。不透明度は 1.0f のままのようです。
4) ユーザーが指を離すと、-touchUp が呼び出されます。specialLayer の不透明度は 0.25 にジャンプし、そこから 1.0f にアニメーション化されます。
メソッドがこの順序で呼び出されることを確認するために、NSLog で確認しました。彼らはそうします。
アニメーション コードのコメントを解除し、不透明度を直接 1.0 に設定すると、その後の直接的な不透明度の変更がすぐに有効になります。問題を引き起こすのは間違いなく CABasicAnimation です。暗黙的なアニメーションを無効にするコードを削除しても、この問題には影響しません。
ここで何が起こっているのか、一生理解できない。opacity に CABasicAnimation を追加した後、しばらくして設定した opacity 値が CALayer に反映されないのはなぜですか? これはバグですか?
私は何を間違っていますか?