【问题标题】:CALayer subclass not animating to property changesCALayer 子类没有对属性更改进行动画处理
【发布时间】:2013-08-19 18:54:00
【问题描述】:

我有一个CALayer 子类,其中浮动animAngle 作为属性标记为@dynamic。我已经为子类实现了方法actionForKeyinitWithLayerneedsDisplayForKeydrawInContextactionForKey的定义如下

- (id<CAAction>)actionForKey:(NString *)event {
    if([event isEqualToString:@"animAngle"]) {
        return [self animationForKey:event];
    }
    return [super actionForKey:event];
}

- (CABasicAnimation *)animationForKey:(NSString *)key
{
    NSString *animValue = [[self presentationLayer] valueForKey:key];// Logs as 0
    CABasicAnimation *anim;

    if([key isEqualToString:@"animAngle"]) {
        anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        anim.repeatCount = HUGE_VAL;
        anim.autoreverses = YES;
        //anim.fromValue = [[self presentationLayer] valueForKey:key]; // setting animation value from layer property as in here does not work.
        anim.fromValue = [NSNumber numberWithFloat:0.5f];            // This works
    }
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    anim.duration = 0.11;
    return anim;
}

在其他类中:

myCASublayer.animAngle = 0.5f;

不知何故,返回的CABasicAnimation 无法正确使用层“animAngle”属性。 我在这里可能做错了什么?

【问题讨论】:

  • 一个叫animAngle另一个叫wiggleAngle
  • @RobvanderVeer:抱歉打错了。它的动画角度。
  • @basstrekerk87,下次更好地复制/粘贴,保存错误!您知道您实际上不必手动缩进代码吗?使用按钮或以 3 个反引号 (`) 开头
  • @RobvanderVeer:确实使用了添加代码按钮,但仍然以某种方式错位了代码。会变得更好
  • 我仍然在努力解决这个问题。有人可以帮忙吗!!!

标签: ios calayer caanimation


【解决方案1】:

CocoaHeads Session: Rob Napier on Animating Custom Layer Properties 是关于自定义动画的一个很好的介绍。

CALayers 讨厌画画 ;)

【讨论】:

  • 谢谢,它有效。但是如果动画的重复次数是无限的,它只会给出一次动画。重复动画不调用drawInContext吗?
  • @basstrekker87 我不确定键的操作是否支持重复。 AFAIK 它或多或少是从旧值到新值的隐式动画。
【解决方案2】:

如果animAngle@property - 您必须为此属性指定accessors
当您将属性标记为@dynamic 时,这意味着您将在运行时动态地提供这些方法的实现。所以,如果你不为属性提供访问器,你就不能访问它。

【讨论】:

  • 尝试为 animAngle 创建访问器,但仍然无法正常工作。为属性本身提供实现的 CALayer 子类需要 @dynamic,但无论如何更改仍未更新
  • 对于 CALayers 来说并非如此。它们是……“特别”;)
  • @DavidRönnqvist:这是不真实的。 Lexandr 的答案或我添加的评论。
  • @basstrekker87 代码是针对答案的,否则我会像你一样使用@回复,就像这个评论一样。层生成自己的访问器,并且可以使用 setValue:forKey 设置任何对象,即使它甚至可能不是 CALayer 上的属性。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2011-01-24
  • 2017-10-06
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多