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

2024-01-09

我正在尝试创建一个子类CALayer与定制index我可以直接设置动画和更改属性,以便根据索引显示不同的图片。

在标题中,我声明:

@property NSUInteger index;

在实现中,我重写了needDisplayForKey:

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

现在,在display方法中,我想根据索引显示一张图片。然而,在动画过程中,self.index永远不会改变,所以我必须查询表示层的值,与上的示例相反通过子类化提供 CALayer 内容 https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coreanimation_guide/Articles/ProvidingCALayerContent.html#//apple_ref/doc/uid/TP40006642-SW1:

- (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或实现一个设置器,display没有被调用,所以我需要改变content在二传手中也是如此。
  • 我应该使用实例变量吗?我应该使用动态实现吗?或者我应该使用setValue:forKey:反而?

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


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

使用自定义 CALayer 制作饼图切片动画 http://blog.pixelingene.com/2012/02/animating-pie-slices-using-a-custom-calayer/

看起来主要技巧是:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

究竟如何子类化 CALayer 并使用自定义属性? 的相关文章

随机推荐