0

NSProgressIndicator は whenstopAnimation:を許可しますisIndeterminate == YESが、決定的な進行状況バーのアニメーションを停止するにはどうすればよいですか?

コンテキストとして、これを実行しようとしているプログレス バーは NSView の子であり、それ自体がviewNSMenuItem のプロパティです。途方もなく高い数値を送信するとsetAnimationDelay:、私が望むことはできますが、一時的にのみです-親メニューを閉じて再度開くと、プログレスバーが再びアニメーション化されます。

(おそらく不必要な免責事項: これは正当な使用例であることを誓います。視覚的に(つまり、テキストを使用せずに) 表示できる必要があります。非常に長時間実行されるタスクは、必要に応じてバックエンドによって一時停止および再開される場合があります)。 . 要約すると「UI デザイン: やってみろ」という回答は、優れた代替案が添付されていない限り受け付けられません。;) )

4

2 に答える 2

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
于 2011-08-14T17:05:49.747 に答える
0

以前に説明したのと同じアプローチを使用して問題を解決しましたが、小さな変更が 1 つあります。

メニューのデリゲートが を受け取ると、(十分に大きな数を引数として) 各プログレス バーmenuNeedsUpdate:に送信します。setAnimationDelay:これは今では確実に機能しているので、十分満足しています。

于 2011-02-16T18:11:47.717 に答える