使NSLevelIndicator绘制圆角边

时间:2013-12-20 22:36:18

标签: objective-c cocoa nslevelindicator

我想为我的NSLevelIndicator创建一个自定义类,它只是围绕边缘。 (比如圆角矩形按钮) 我创建了一个自定义类,我知道我必须在

中实现它
-(void)drawRect:(NSRect)dirtyRect;

方法,但我完全不知道如何实现这一点,我希望有人对此有所了解。

2 个答案:

答案 0 :(得分:1)

Output

@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:

希望这有帮助!