5

私は NSProgressIndicator をサブクラス化するのが好きです。このコードを使用し、Interface Builder でサブクラスを設定しました。

- (void)drawRect:(NSRect)dirtyRect {
NSRect rect = NSInsetRect([self bounds], 1.0, 1.0);
CGFloat radius = rect.size.height / 2;
NSBezierPath *bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:2.0];
[[NSColor blackColor] set];
[bz stroke];

rect = NSInsetRect(rect, 2.0, 2.0);
radius = rect.size.height / 2;
bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:1.0];
[bz addClip];
rect.size.width = floor(rect.size.width * ([self doubleValue] / [self maxValue]));
NSRectFill(rect);

アプリが起動すると、次のようになります。 アプリ起動

ただし、コピーの進行中に古いバーが表示されます。 コピー中

どうしたの?

4

2 に答える 2

2

ではプログレスバーの進行状況が描画されていないようでdrawRect:、オーバーライドするだけdrawRect:では不十分です。ただし、プログレスバーのレイヤーを裏打ちする場合は、すべての描画を行う責任があります。

ドキュメントから:

ビュー クラスは自動的にバッキング レイヤーを作成し ( makeBackingLayerオーバーライドされた場合に使用)、ビュー クラスの描画メカニズムを使用する必要があります。

IB の「Core Animation Layer」を確認するか、これをサブクラスに追加します。

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setWantsLayer:YES];
}
于 2013-09-06T08:42:30.780 に答える