如何在确定的NSProgressIndicator上停止动画?

时间:2011-02-09 15:56:51

标签: cocoa animation nsprogressindicator

NSProgressIndicator在stopAnimation:时允许isIndeterminate == YES,但如何为确定的进度条停止动画?

对于上下文,我尝试使用的进度条是NSView的子级,NSView本身是NSMenuItem的view属性。将可笑的高数字发送到setAnimationDelay:可以实现我想要的,但只是暂时的 - 当父菜单关闭并重新打开时,进度条会再次动画。

(可能不必要的免责声明:我发誓这是一个合法的用例;我必须能够在视觉上(即:不使用文本)显示非常长时间运行的任务的进度根据后端的需要暂停和重新启动。除非伴随着一个精彩的替代建议,否则将不会接受归结为“UI设计:你在做什么”的答案。;))

2 个答案:

答案 0 :(得分:1)

像这样的子类NSProgressIndicator,它也适用于Lion:

@interface UnanimatedProgressIndicator : NSProgressIndicator {
@private
    BOOL    isAnimating;
}
@end

@interface NSProgressIndicator (HeartBeat)
- (void) heartBeat:(id)sender;      // Apple internal method for the animation
@end

@implementation UnanimatedProgressIndicator

- (void) startAnimation:(id)sender
{
    isAnimating = YES;
    [super startAnimation:sender];
}

- (void) stopAnimation:(id)sender
{
    isAnimating = NO;
    [super stopAnimation:sender];
}

- (void) heartBeat:(id)sender
{
    if (isAnimating)
        [super heartBeat:sender];
}

@end

答案 1 :(得分:0)

使用与前面描述相同的方法解决问题,只做了一个小改动。

当菜单的代表收到menuNeedsUpdate:时,我会向每个进度条发送setAnimationDelay:(带有足够大的数字作为arg)。现在这个工作可靠,所以我对它很开心。