2

私を夢中にさせている問題があります。「バー」フォームでサブクラス化NSProgressIndicatorし、いくつかの論理状態に基づいてプログレス バーの色を変更したいと考えています。そのために、私は基本的に-drawRect:いつものようにオーバーライドします。しかし、ライオンで非常に奇妙なことが起こります。-drawRect経由でスーパークラスの実装を呼び出すだけで、[super drawRect:]他に何もしない場合でも、進行状況バー全体が、 Lionの前に使用されていたスタイルを使用して表示されます。ご存じのとおり、Lion では、プログレス バーのスタイルが以前のガラス状のものから、よりフラットで洗練された外観に変更されました。

繰り返しますが、オーバーライド-drawRectしてスーパークラスの実装を呼び出すだけで、プログレス バーのスタイルが Leopard のものに変わります。何が起こっているのか、どうすればこれを修正できるのか、少しでも知っている人はいますか?

4

2 に答える 2

1

CustomeProgressIndicator.h:

#import <Cocoa/Cocoa.h>

@interface CustomProgressIndicator : NSView {

    double m_minValue;
    double m_maxValue;
    double m_value;
}

- (void)setMaxValue:(double)newMaxValue;
- (void)setMinValue:(double)newMinValue;
- (void)setDoubleValue:(double)newDoubleValue;
- (void)drawRect:(NSRect)dirtyRect;   
@end

CustomProgressIndicator.m:

#import "CustomProgressIndicator.h"

@implementation CustomProgressIndicator

- (void)setMaxValue:(double)newMaxValue
{
    m_maxValue = newMaxValue;
}

- (void)setMinValue:(double)newMinValue
{
    m_minValue = newMinValue;
}

- (void)setDoubleValue:(double)newDoubleValue
{
    m_value = newDoubleValue;
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:dirtyRect];

    double width = ((m_value - m_minValue) / (m_maxValue - m_minValue));
    CGRect bar = dirtyRect;
    bar.size.width *= width;

    [[NSColor darkGrayColor] set];
    [NSBezierPath fillRect:bar];    
}
于 2014-09-25T23:32:11.270 に答える
1

プログレス インジケーターをレイヤーでサポートし、Core Image フィルターを適用して色を変更するのはどうですか?

于 2012-05-17T20:38:23.690 に答える