2013-12-20 109 views
1

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

-(void)drawRect:(NSRect)dirtyRect; 

方法来实现这一点,但我完全不知道如何实现这一点,我希望有人有一个想法这个。

+1

“...我知道我必须在['drawRect:']方法中实现这个...”这里有一个问题:NSLevelIndicator是一个控件,而不是常规视图,所以您必须至少部分在单元级。好消息是,你可能根本不需要继承NSLevelIndicator;坏消息是,你不得不继承NSLevelIndicatorCell的子类(如果没有的话)。 –

回答

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 ]; 
} 
+0

谢谢,但不是我正在寻找的那种风格。它似乎只有一条线围绕着LevelIndicator绘制。我试图改变绿色的电平指示器 – user3124229

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:

希望这有助于!