Cocoa:在Lion上对NSProgressIndicator进行子类化

时间:2011-10-11 09:27:58

标签: objective-c cocoa mobile nsprogressindicator

我有一个让我发疯的问题。我想在其“Bar”形式中继承NSProgressIndicator,以根据几个逻辑状态更改进度条的颜色。为此,我基本上像往常一样覆盖-drawRect:。然而Lion上发生了一件非常奇怪的事情。即使我的-drawRect只是通过[super drawRect:]调用超类的实现而没有做任何其他事情,整个进度条将使用在 Lion之前使用的样式显示。如果你还记得,对于Lion来说,进度条的风格可以从以前的玻璃条更改为更平整和光滑的外观。

同样,只是覆盖-drawRect除了调用超类'实现之外什么也不做,只会将进度条的样式更改为Leopard。有没有人知道发生了什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如何使进度指示器支持图层并应用Core Image过滤器来重新着色它?

答案 1 :(得分: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];    
}