W podklasy CALayer pracuję nad mam właściwość niestandardową, że chcę, aby animować automatycznie, czyli przy założeniu, że nieruchomość jest o nazwie „myProperty”, chcę następujący kod:Niestandardowa animacja właściwości z actionForKey: jak uzyskać nową wartość właściwości?
[myLayer setMyProperty:newValue];
powodować płynna animacja od bieżącej wartości do "nowej wartości".
Korzystanie z podejścia nadpisującego działanieForKey: and needsDisplayForKey: (patrz poniższy kod) Udało mi się go bardzo dobrze uruchomić, po prostu interpolując między starą i nową wartością.
Moim problemem jest to, że chcę użyć nieco innego czasu trwania animacji lub ścieżki (lub czegoś podobnego) w zależności od aktualnej wartości i nowej wartości nieruchomości, a ja nie byłem w stanie wymyślić, jak uzyskać nowe wartość od wewnątrz actionForKey:
góry dzięki
@interface ERAnimatablePropertyLayer : CALayer {
float myProperty;
}
@property (nonatomic, assign) float myProperty;
@end
@implementation ERAnimatablePropertyLayer
@dynamic myProperty;
- (void)drawInContext:(CGContextRef)ctx {
... some custom drawing code based on "myProperty"
}
- (id <CAAction>)actionForKey:(NSString *)key {
if ([key isEqualToString:@"myProperty"]) {
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:key];
theAnimation.fromValue = [[self presentationLayer] valueForKey:key];
... I want to do something special here, depending on both from and to values...
return theAnimation;
}
return [super actionForKey:key];
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"myProperty"])
return YES;
return [super needsDisplayForKey:key];
}
@end
Implementacja akcesora dla właściwości @dynamic (myProperty) sprawia, że cała magia znika - CA po prostu przestaje inicjować niejawne transakcje dla usługi. – zrxq
Warto wiedzieć, ale biorąc pod uwagę fakt, że OP chce wyraźnej animacji, powiedziałbym, że to nie problem. – Simon
OP chce ukrytego. "Mam niestandardową właściwość, którą chcę animować automatycznie". Ponadto, myProperty jest @dynamic w oryginalnym fragmencie. – zrxq