gpt4 book ai didi

iphone - 究竟如何子类化 CALayer 并使用自定义属性?

转载 作者:行者123 更新时间:2023-12-03 18:22:44 25 4
gpt4 key购买 nike

我正在尝试使用自定义index属性创建CALayer的子类,我可以直接对其进行动画处理和更改,以便根据索引显示不同的图片.

在标题中,我声明:

@property NSUInteger index;

在实现中,我覆盖了needDisplayForKey:

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

现在,在display方法中,我想根据索引显示一张图片。但是,在动画期间,self.index 的值永远不会改变,因此我必须查询表示层的值,这与 Providing CALayer Content by Subclassing 上的示例相反。 :

- (void)display
{
NSUInteger presentationIndex = [(CustomLayer *)[self presentationLayer] index];
self.contents = (id)[[images objectAtIndex:presentationIndex] CGImage];
}

问题是,如果我这样做,我无法直接在动画之外设置 index 值,因为它只会更改模型层,并且 display方法显式查询表示层。

如果我添加一个复制 index 值的初始化方法,它就会起作用:

- (id)initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
if ([layer isKindOfClass:[CustomLayer class]])
self.index = [(CustomLayer *)layer index];
}
return self;
}

但是,在动画之后或之前,总是会出现 1 个图像故障,因为演示或模型值不匹配(取决于我是否将 index 设置为目标值)。

  • 令人惊讶的是,drawInContext: 方法似乎总是具有[self index] 的正确值,但这不是我想要使用的方法,因为我只是用图像设置了 content 属性。
  • 根据实现 index 属性的方式,我会得到不同的行为。如果我使用 @dynamic index (这是有效的,即使文档没有说自定义属性 getters/setters 将动态实现),每次调用时都会调用 display index 的值已更改。如果我使用 @synthesize 或实现 setter,则不会调用 display,因此我也需要更改 setter 中的content。<
  • 我应该使用实例变量吗?我应该使用动态实现吗?或者我应该使用 setValue:forKey: 来代替?

正如你所看到的,我对如何获得我想要的结果以及如何使用自定义属性正确实现 CALayer 的子类有点困惑。任何帮助和解释,将不胜感激!

最佳答案

网络上有一个很棒的教程,解释了如何创建具有可动画属性的自定义 CALayer 子类。我还没有机会尝试,但我把它加入了书签。这是链接:

Animating Pie Slices Using a Custom CALayer

看起来主要技巧是:

对自定义 CALayer 的可动画属性使用 @dynamic,而不是 @synthesize。

覆盖actionForKey:、initWithLayer:和needsDisplayForKey:,也许还有drawInContext:

关于iphone - 究竟如何子类化 CALayer 并使用自定义属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387406/

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