そのため、プレゼンテーション層のキャッシングと思われる興味深い問題に直面しており、他の人がこれを見ているかどうか、またどのような回避策があるかを考えています.
暗黙的にアニメーション化している独自のプロパティがいくつかあります。プロパティとして宣言し、動的に合成することでこれを行っています。
@interface GOOLayer : CALayer
@property float gooValue;
@end
NSString *const kGOOLayerValueKey = @"gooValue";
@implementation GOOLayer
@dynamic gooValue;
- (id)initWithLayer:(id)layer {
if ((self = [super initWithLayer:layer])) {
id value = [layer valueForKey:kGOOLayerValueKey];
[self setValue:value forKey:kGOOLayerValueKey];
}
return self;
}
- (id<CAAction>)actionForKey:(NSString *)event {
id <CAAction> action = [super actionForKey:event];
if (action == nil && [event isEqual:kGOOLayerValueKey]) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.fromValue = [self.presentationLayer valueForKey:event];
animation.duration = [CATransaction animationDuration];
return animation;
}
return action;
}
- (void)display {
GOOLayer *presoLayer = [self presentationLayer];
NSLog(@"Display GooValue: %f", presoLayer.gooValue);
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqual:kGOOLayerValueKey]) {
return YES;
}
return [super needsDisplayForKey:key];
}
ほとんどの場合、これで問題なく動作し、適切な値が記録されていることがわかります。最初のケースでは、適切な暗黙のアニメーションを取得します。
- (IBAction)doSomeGoo:(id)sender {
sublayer_.gooValue = random();
}
出力:
2012-12-19 10:10:41.440 CoreAnimation[94149:c07] Display GooValue: 1804289408.000000
2012-12-19 10:10:41.502 CoreAnimation[94149:c07] Display GooValue: 1804289408.000000
...
2012-12-19 10:10:41.739 CoreAnimation[94149:c07] Display GooValue: 898766464.000000
2012-12-19 10:10:41.757 CoreAnimation[94149:c07] Display GooValue: 846930880.000000
2 番目のケースでは、アクションを無効にして、単一の値の更新を取得します。これで問題ありません。
- (IBAction)doSomeGoo2:(id)sender {
long newValue = random();
NSLog(@"newValue = %f", (float)newValue);
[CATransaction begin];
[CATransaction setDisableActions:YES];
sublayer_.gooValue = newValue;
[CATransaction commit];
}
初めて:
2012-12-19 10:11:16.208 CoreAnimation[94149:c07] newValue = 1714636928.000000
2012-12-19 10:11:16.209 CoreAnimation[94149:c07] Display GooValue: 1714636928.000000
2回目:
2012-12-19 10:11:26.258 CoreAnimation[94149:c07] newValue = 1957747840.000000
2012-12-19 10:11:26.259 CoreAnimation[94149:c07] Display GooValue: 1957747840.000000
興味深いのは、トランザクションを実行する前に [CALayer presentationLayer] を呼び出す 3 番目のケースです。
- (IBAction)doSomeGoo3:(id)sender {
GOOLayer *presoLayer = sublayer_.presentationLayer;
long newValue = random();
NSLog(@"presoLayer.gooValue = %f newValue = %f", presoLayer.gooValue, (float)newValue);
[CATransaction begin];
[CATransaction setDisableActions:YES];
sublayer_.gooValue = newValue;
[CATransaction commit];
}
初めて:
2012-12-19 10:12:12.505 CoreAnimation[94149:c07] presoLayer.gooValue = 1957747840.000000 newValue = 424238336.000000
2012-12-19 10:12:12.505 CoreAnimation[94149:c07] Display GooValue: 1957747840.000000
2回目:
2012-12-19 10:12:13.905 CoreAnimation[94149:c07] presoLayer.gooValue = 424238336.000000 newValue = 719885376.000000
2012-12-19 10:12:13.906 CoreAnimation[94149:c07] Display GooValue: 424238336.000000
表示が現在の値を取得しないように、presentationLayer 呼び出しを追加する方法に注意してください。
これに対処する方法についての提案、または私が物事を完全に誤解している場合、これは予想される動作ですか?