2013-08-27 9 views
5

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

- (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); 

アプリは、このようにそのルックスを開始すると: App start

しかし、コピー中に古いバーが現れ進行します。 During copying

何が間違っていますか?

+0

あなたが追加するのを忘れ[スーパーのdrawRectを:RECT] –

+0

それは[スーパーのdrawRect:RECT]では動作しませんです。 – Konobi

+0

NSLogをサブクラスに追加し、サブクラスは起動時に一度だけ呼び出しますが、コピーの進行中はクラスは呼び出されません。 – Konobi

答えて

2

進捗バーの進捗状況はdrawRect:には表示されないため、drawRect:をオーバーライドするだけでは不十分です。ただし、プログレスバーレイヤーをバックアップする場合は、すべての図面を実行する責任があります。 documentationから

ビュークラスは、自動的に(上書き場合 makeBackingLayerを使用して)あなたのための裏打ち層を作成し、ビュークラスの 描画メカニズムを使用する必要があります。

IBで「Core Animationのレイヤ」を確認したり、サブクラスにこれを追加します。

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    [self setWantsLayer:YES]; 
} 
+0

ええ、Core Animation Layerを設定するのを忘れました。 Thx ... Cocoaの初心者です。前にサブクラス化しようとしたことはありません; D – Konobi

1

私は、上記のアドバイス(おかげで!)に続く、残念ながらNSProgressIndicatorのサイズが変更されたときにことを発見それは消えましたが、最初の鑑賞時のみ(それは引き出しの中にありました)。

何が起きているのかを理解するのではなく、私がやっていたことが色が変わる強さの指標であるため、実際に古いコントロールが必要でないことに気付きました。 NSViewのサブクラスを作成するだけです。

だから、これはそれである:

@interface SSStrengthIndicator : NSView 
/// Set the indicator based upon a score from 0..4 
@property (nonatomic) double strengthScore; 
@end 

@implementation SSStrengthIndicator 
- (void)setStrengthScore:(double)strength 
{ 
    if (_strengthScore != strength) { 
     _strengthScore = strength; 
     [self setNeedsDisplay:YES]; 
    } 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect rect = NSInsetRect([self bounds], 1.0, 2.0); 
    double val = (_strengthScore + 1) * 20; 
    if (val <= 40) 
     [[NSColor redColor] set]; 
    else if (val <= 60) 
     [[NSColor yellowColor] set]; 
    else 
     [[NSColor greenColor] set]; 

    rect.size.width = floor(rect.size.width * (val/100.0)); 
    [NSBezierPath fillRect:rect]; 
} 
@end 
関連する問題