如何继承CALayer并使用自定义属性?

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

在标题中,我宣称:

@property NSUInteger index;

在实现中,我覆盖了needDisplayForKey

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

现在,在display方法中,我想根据索引显示图片。 但是,在动画过程中, self.index的值永远不会改变,所以我必须查询表示层的值,与通过子类提供CALayer内容的例子相反:

- (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),也可以使用@dynamic index ,但每次index值发生更改时都会调用display 。 如果我使用@synthesize或实现setter,则不会调用display ,因此我需要更改setter中的content
  • 我应该使用实例变量吗? 我应该使用动态实现吗? 或者我应该使用setValue:forKey:而不是?
  • 正如您所看到的,我对如何获得我想要的结果以及如何使用自定义属性正确实现CALayer的子类感到困惑。 任何帮助和解释,将不胜感激!


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

    使用自定义CALayer设置动画片切片

    看起来主要的技巧是:

    将@dynamic,而不是@synthesize用于您的自定义CALayer的动画属性。

    覆盖actionForKey:,initWithLayer:和needsDisplayForKey :,也许drawInContext:

    链接地址: http://www.djcxy.com/p/74167.html

    上一篇: How exactly to subclass CALayer and use a custom property?

    下一篇: Animating a custom property in a CALayer