我想为我的NSLevelIndicator
创建一个自定义类,它只是将边缘四舍五入。 (即像圆角的矩形按钮) 我创建了一个自定义类,我知道我必须在使NSLevelIndicator绘制圆角边缘
-(void)drawRect:(NSRect)dirtyRect;
方法来实现这一点,但我完全不知道如何实现这一点,我希望有人有一个想法这个。
我想为我的NSLevelIndicator
创建一个自定义类,它只是将边缘四舍五入。 (即像圆角的矩形按钮) 我创建了一个自定义类,我知道我必须在使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 ];
}
谢谢,但不是我正在寻找的那种风格。它似乎只有一条线围绕着LevelIndicator绘制。我试图改变绿色的电平指示器 – user3124229
子类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:
希望这有助于!
“...我知道我必须在['drawRect:']方法中实现这个...”这里有一个问题:NSLevelIndicator是一个控件,而不是常规视图,所以您必须至少部分在单元级。好消息是,你可能根本不需要继承NSLevelIndicator;坏消息是,你不得不继承NSLevelIndicatorCell的子类(如果没有的话)。 –