Какао: подклассы NSProgressIndicator на Lion
У меня есть проблема, которая сводит меня с ума. Я хочу подкласс NSProgressIndicator
в форме "Бар", чтобы изменить цвет индикатора выполнения на основе нескольких логических состояний. Для этого я в основном переопределить -drawRect:
по-прежнему. Однако очень странная вещь случается на льве. Даже если мой -drawRect
просто вызывает реализацию суперкласса через [super drawRect:]
и больше ничего не делает, весь индикатор выполнения будет отображаться в стиле, который использовался до Lion. Если вы помните, у Lion стиль индикатора прогресса изменился на более плоский и гладкий, чем у предыдущего стеклянного.
Опять же, просто переопределение -drawRect
ничего не делать, кроме как вызывать реализацию суперкласса, меняет стиль индикатора выполнения на леопардовый. Кто-нибудь имеет хоть малейшее представление о том, что происходит и как я могу это исправить?
2 ответа
Как насчет создания слоя индикатора прогресса и применения фильтра Core Image, чтобы перекрасить его?
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];
}