1

我想为我创建一个自定义类,NSLevelIndicator它只是将边缘四舍五入。(即像圆角矩形按钮)我创建了一个自定义类,我知道我必须在

-(void)drawRect:(NSRect)dirtyRect;

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

4

2 回答 2

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 ];
}
于 2013-12-21T04:48:31.603 回答
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

然后,NSLevelIndicatorCustomLevelIndicatorCell可以在 InterfaceBuilder 或代码中将您的单元格设置为您的setCell:

希望这可以帮助!

于 2014-01-05T15:25:14.803 回答