2010-03-07 89 views
30

我有一个名为myInt的NSInteger属性的CALayer子类MyLayer。我真的很想通过CABasicAnimation来动画这个属性,但是看起来CABasicAnimation只能用于所谓的“动画”属性(边界,位置等)。有什么我可以重写,使我的自定义myInt属性动画?动画CALayer子类的自定义属性

+1

试着让这个属性成为'float'吗? – kennytm 2010-03-07 06:23:32

回答

68

是的,这是可能的(只有在最新的核心动画发布,但我相信,即iPhone 3.0 +和OS X 10.6+)。

  1. 让你的财产动态,使CA实现存取你:

    @dynamic myInt; 
    
  2. 告诉层的性质的变化需要重新划分:

    + (BOOL)needsDisplayForKey:(NSString*)key { 
        if ([key isEqualToString:@"myInt"]) { 
         return YES; 
        } else { 
         return [super needsDisplayForKey:key]; 
        } 
    } 
    
  3. 使用值myInt在您的drawInContext:方法中。现在,当您制作动画myInt时,Core Animation将为动画的每个步骤插值,并重复要求图层自行绘制。

  4. 如果您还想为此属性启用隐式动画,还可覆盖actionForKey:

+0

谢谢!这让我非常接近我可以品尝到的解决方案! -drawInContext:使用myInt正确插值多次调用。不幸的是CGContextDrawImage()在动画运行时不再起作用。我填充的Rects或笔画都是正确绘制的,但通常由CGContextDrawImage()绘制的图像会消失,直到动画结束,就像从不调用CGContextDrawImage()一样。我很困惑。有什么想法吗? – jemmons 2010-03-07 23:52:05

+0

不知道,对不起。我希望你找到一个解决方案。 – 2010-03-08 00:09:05

+3

没关系。您的回复仍然是我在Stack Overflow上看到的最好的书面答案之一:) – jemmons 2010-03-08 00:37:49

6

保留您的自定义CALayer的子类的实例变量的方法。您重写initWithLayer:,该方法被调用来创建自定义图层的副本。例如,如果您有要在其中创建一个名为“角度”的自定义属性层,你可以使用下面的代码:

@implementation AngledLayer 
@synthesize angle = _angle 

// Tell Core Animation that this key should be animated 
+ (BOOL) needsDisplayForKey:(NSString *)key 
{ 
    if ([key isEqualToString:@"angle"]) return YES; 
    return [super needsDisplayForKey:key]; 
} 


// Make sure that, when the layer is copied, so is the custom ivar 
- (id) initWithLayer:(id)layer 
{ 
    self = [super initWithLayer:layer]; 
    if (self) { 
     AngledLayer *angledVersion = (AngledLayer *)layer; 
     self.angle = angledVersion.angle; 
    } 
    return self; 
} 

而完事大吉!请注意,您不能将此对象与隐式动画一起使用,您也必须覆盖actionForKey:方法。

+1

这不适合我。在'initWithLayer'里面,即使在动画时,图层也始终具有属性的起始值。二传手被称为别的地方。 – zakdances 2013-04-26 11:56:44

+1

我看到和你的朋友一样。虽然initWithLayer和needsDisplayForkey的组合允许动画发生,但一旦它结束,图层就会返回到其初始值。我仍在寻找解决方案。 – 2013-07-29 17:18:18

+0

好吧,看起来我并没有意识到@dynamic会导致setter自动生成动画。但如果出于某种原因需要做更多的事情,您可能需要创建自己的具有自己的动画块的setter,以便在动画发生之前更改图层属性。见[link](http://stackoverflow.com/questions/11515647/objective-c-cabasicanimation-applying-changes-after-animation) – 2013-07-29 17:31:45