gpt4 book ai didi

iphone - CATransaction 未观察到 CALayer 子类上的属性

转载 作者:可可西里 更新时间:2023-11-01 17:10:48 24 4
gpt4 key购买 nike

我有一个带有自定义属性的 CALayer 子类,声明如下:

@interface MyLayer : CALayer
@property (nonatomic,retain) NSNumber *customValue;
@end
@implementation MyLayer
@synthesize customValue = _customValue;
@end

我想在显式 CATranasction 中为该属性设置动画,因此我使用 actionForLayer:forKey: 方法设置了一个委托(delegate),该方法返回一个动画,但是任何对 [CATransaction begin] ... [CATransaction end] 内的 someMyLayerInstance.customValue 的更改不会导致 actionForLayer:forKey 被调用相应的“键”值。

但是,通过调用 setValue:forKey: 更改 MyLayer 上的属性并更改 myLayerInstance 导致 actionForLayer:forKey: 被调用。

这似乎是因为 CALayer 对未定义属性的键/值编码做了一些操作。我怎样才能重新创建这个 mojo,以便我可以在 MyLayer 上声明属性,但仍然让动画委托(delegate)观察到它们?

最佳答案

最重要的是,您需要使用@dynamic 实现所有CALayer 访问器。不要使用 @synthesize 并且不要直接实现访问器。 CALayer 生成它自己的所有属性处理程序(正如您间接发现的那样),您需要让它们被使用。

您还需要让 CALayer 知道此属性会影响显示(根据您的其他评论,您可能已经这样做了)。如果还没有,您可以通过实现 +needsDisplayForKey: 并为您的 key 返回 YES 来完成此操作。

这是一个为自定义属性设置动画的 CALayer 示例(取自 iOS 5 Programming Pushing the Limits 的第 7 章。完整的 sample code 可在 Wiley 站点获得。)此示例实现了 actionForKey: 在层中,但如果您愿意,您仍然可以在委托(delegate)中实现该部分。

@implementation CircleLayer
@dynamic radius;

...

+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"radius"]) {
return YES;
}
return [super needsDisplayForKey:key];
}

- (id < CAAction >)actionForKey:(NSString *)key {
if ([self presentationLayer] != nil) {
if ([key isEqualToString:@"radius"]) {
CABasicAnimation *anim = [CABasicAnimation
animationWithKeyPath:@"radius"];
anim.fromValue = [[self presentationLayer]
valueForKey:@"radius"];
return anim;
}
}

return [super actionForKey:key];
}

@end

关于iphone - CATransaction 未观察到 CALayer 子类上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8936197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com