0

与这个斗争。我有一个正在尝试制作动画的自定义 NSStatusItemView。我已将以下代码添加到我的状态项视图以启动动画:

- (void)setAnimated
{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    anim.duration = 1.0;
    anim.repeatCount = HUGE_VALF;
    anim.autoreverses = YES;
    anim.fromValue=[NSNumber numberWithFloat:1.0];
    anim.toValue=[NSNumber numberWithFloat:0.0];
    [self.layer addAnimation: anim forKey: @"animateOpacity"];
    [self setWantsLayer:YES];  
    [self setNeedsDisplay:YES];
}

当我调用这个方法时,什么也没有发生。但是,如果我将此代码移动到我的drawRect方法中,则视图会在启动时正确设置动画。不完全确定我需要做什么才能告诉它事后开始动画,但上述方法没有做到,我不知道为什么!有任何想法吗?

4

1 回答 1

0

好的回答自己,所以谷歌有答案的记录!

问题是,有点缺乏对drawRect的理解。当我的 setAnimated 方法调用 setNeedsDisplay 时,它再次调用 drawRect,有效地撤消了 setAnimated 方法中所做的事情。

我做了两件事来正确解决这个问题。首先,我修改了 setAnimated 方法以接受 BOOL 参数并将视图上的 isAnimated 属性设置为该值。然后,我在 drawRect 中检查这个 BOOL 值,如果它设置为 YES,则执行动画。

其次,您似乎需要在第一次绘制视图时调用 [self setWantsLayer: YES] 。所以我在第一次运行时在 drawRect 中调用它,以便以后的动画可以工作。

于 2013-03-06T00:31:18.750 回答