我想为我的NSLevelIndicator
创建一个自定义类,它只是围绕边缘。 (比如圆角矩形按钮)
我创建了一个自定义类,我知道我必须在
-(void)drawRect:(NSRect)dirtyRect;
方法,但我完全不知道如何实现这一点,我希望有人对此有所了解。
答案 0 :(得分:1)
@interface DILevelIndicatorCell : NSLevelIndicatorCell
@property ( readwrite, assign ) BOOL drawBezel;
@property ( readwrite, assign ) BOOL verticalCenter;
@end
- ( void )drawWithFrame:( NSRect ) rcCellFrame inView:( NSView* ) pControlView
{
NSRect rcInterior = rcCellFrame;
if( _drawBezel )
{
[ self _drawBezelWithFrame:rcCellFrame ];
rcInterior = NSInsetRect( rcCellFrame, 3, 3 );
}
if( _verticalCenter )
{
CGFloat i = ( NSHeight( rcInterior ) - [ self cellSize ].height ) / 2;
rcInterior.origin.y += i;
rcInterior.size.height -= i;
}
[ super drawWithFrame:rcInterior inView:pControlView ];
}
- ( void )_drawBezelWithFrame:( NSRect ) dirtyRect
{
CGFloat fRoundedRadius = 10.0f;
NSGraphicsContext* ctx = [ NSGraphicsContext currentContext ];
[ ctx saveGraphicsState ];
{
NSBezierPath* pPath = [ NSBezierPath bezierPathWithRoundedRect:dirtyRect
xRadius:fRoundedRadius
yRadius:fRoundedRadius ];
[ pPath setClip ];
[ [ NSColor colorWithCalibratedRed:0.9 green:0.9 blue:0.95 alpha:1.0 ] setFill ];
NSRectFillUsingOperation ( dirtyRect, NSCompositeSourceOver );
[ [ NSColor colorWithCalibratedRed:0.7 green:0.7 blue:0.85 alpha:1.0 ] setFill ];
[ pPath setLineWidth:1 ];
[ pPath stroke ];
}
[ ctx restoreGraphicsState ];
}
答案 1 :(得分:0)
子类NSLevelIndicatorCell
并覆盖drawWithFrame:inView:
#import "CustomLevelIndicatorCell.h"
@implementation CustomLevelIndicatorCell
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
double level = (self.floatValue - self.minValue)/(self.maxValue- self.minValue);
if (level > 1.0){level = 1.0;}
NSLog(@"Level: %a", level);
NSColor *fillColor;
if(self.value < self.criticalValue)
fillColor = [NSColor redColor];
else if(self.value < self.warningValue)
fillColor = [NSColor yellowColor];
else
fillColor = [NSColor greenColor];
NSRect levelRect = NSInsetRect(cellFrame, 2, 1);
levelRect.size.width = levelRect.size.width * level;
NSBezierPath * levelPath = [NSBezierPath bezierPathWithRoundedRect:levelRect xRadius:3 yRadius:3];
[fillColor setFill];
[levelPath fill];
NSBezierPath * indicatorPath = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(cellFrame, 2, 1) xRadius:3 yRadius:3];
[indicatorPath setLineWidth:1];
[[NSColor grayColor] setStroke];
[indicatorPath stroke];
}
@end
然后,您只需将NSLevelIndicator
的单元格设置为CustomLevelIndicatorCell
,可以在InterfaceBuilder中设置,也可以在代码中设置setCell:
希望这有帮助!