【问题标题】:Properties on CALayer subclass aren't getting observed by CATransactionCATransaction 没有观察到 CALayer 子类的属性
【发布时间】:2012-01-20 02:48:15
【问题描述】:

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

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

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

但是,在MyLayer 上删除属性并通过调用setValue:forKey:myLayerInstance 进行更改确实会导致actionForLayer:forKey: 被调用。

这似乎是因为CALayer 为未定义属性的键/值编码做了一些魔力。如何重新创建此 mojo 以便我可以在 MyLayer 上声明属性,但仍让动画委托观察它们?

【问题讨论】:

    标签: iphone ios core-animation key-value-coding


    【解决方案1】:

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

    您还需要让CALayer 知道此属性会影响显示(考虑到您的其他 cmets,您可能已经这样做了)。如果您还没有,您可以通过实现+needsDisplayForKey: 并返回YES 作为您的密钥来执行此操作。

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

    @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
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2010-12-06
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多