我想为我创建一个自定义类,NSLevelIndicator
它只是将边缘四舍五入。(即像圆角矩形按钮)我创建了一个自定义类,我知道我必须在
-(void)drawRect:(NSRect)dirtyRect;
方法,但我完全不知道如何实现这一点,我希望有人对此有所了解。
我想为我创建一个自定义类,NSLevelIndicator
它只是将边缘四舍五入。(即像圆角矩形按钮)我创建了一个自定义类,我知道我必须在
-(void)drawRect:(NSRect)dirtyRect;
方法,但我完全不知道如何实现这一点,我希望有人对此有所了解。
@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 ];
}
子类化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:
希望这可以帮助!