CALayer子类不会动画到属性更改

6

我有一个CALayer子类,带有浮点数属性animAngle,标记为@dynamic。我已经为子类实现了actionForKeyinitWithLayerneedsDisplayForKeydrawInContext方法。

actionForKey的定义如下:

- (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 - Rob van der Veer
@RobvanderVeer:抱歉那是打错了,应该是 animAngle。 - Madhur Rawat
@basstrekerk87,下次最好复制/粘贴,这样可以避免错误!你知道你不必手动缩进代码吗?使用按钮或以3个反引号(`)开头即可。 - Rob van der Veer
@RobvanderVeer:尝试使用添加代码按钮,但还是无法对齐代码。会慢慢变得更好的。 - Madhur Rawat
我还在为这个问题苦恼,有人能帮帮我吗?! - Madhur Rawat
2个回答

1

谢谢,它有效。但如果动画在重复次数上是无限的,它只会播放一次。drawInContext对于重复的动画不被调用吗? - Madhur Rawat
@basstrekker87 我不确定按键操作是否支持重复。据我所知,它更多或少是从旧值到新值的隐式动画。 - David Rönnqvist

1
如果animAngle是一个@property,你必须为该属性指定accessors
当您将属性标记为@dynamic时,这意味着您将在运行时动态提供这些方法的实现。因此,如果未为属性提供访问器,则无法访问它。

尝试为animAngle创建访问器,但仍然无法正常工作。对于CALayer子类,需要使用@dynamic来提供属性本身的实现,但是无论如何更改仍然未能更新。 - Madhur Rawat
这并不适用于CALayers。它们是“特殊”的;) - David Rönnqvist
@DavidRönnqvist:什么是不真实的,是Lexandr的回答还是我添加的评论。 - Madhur Rawat
@basstrekker87 这段代码是针对答案的,否则我会像你一样使用 @ 回复,就像这个评论一样。图层会生成自己的访问器,并且可以使用 setValue:forKey 设置任何对象,即使它可能不是 CALayer 上的属性。 - David Rönnqvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接