子类 NSProgressIndicator

Posted

技术标签:

【中文标题】子类 NSProgressIndicator【英文标题】:Subclass NSProgressIndicator 【发布时间】:2013-08-27 12:01:19 【问题描述】:

我喜欢继承一个 NSProgressIndicator。我已经使用了这段代码,并在 Interface Builder 中设置了子类:

- (void)drawRect:(NSRect)dirtyRect 
NSRect rect = NSInsetRect([self bounds], 1.0, 1.0);
CGFloat radius = rect.size.height / 2;
NSBezierPath *bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:2.0];
[[NSColor blackColor] set];
[bz stroke];

rect = NSInsetRect(rect, 2.0, 2.0);
radius = rect.size.height / 2;
bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:1.0];
[bz addClip];
rect.size.width = floor(rect.size.width * ([self doubleValue] / [self maxValue]));
NSRectFill(rect);

当应用程序启动时,它的外观如下:

但是在复制过程中,旧条出现了。

怎么了?

【问题讨论】:

你忘了添加 [super drawRect:rect] 它不适用于 [super drawRect:rect]。 所以我将 NSLog 添加到我的子类中,并且子类在开始时只调用一次,但在复制过程中从不调用该类。 【参考方案1】:

似乎drawRect:中没有绘制进度条的进度,所以仅仅覆盖drawRect:是不够的。但是,如果你让进度条层被支持,你负责做所有的绘图。

来自documentation:

视图类会自动为您创建一个支持层(使用 makeBackingLayer 如果被覆盖),你必须使用视图类的 绘图机制。

检查 IB 中的“核心动画层”或将其添加到您的子类中:

- (void)awakeFromNib 
    [super awakeFromNib];
    [self setWantsLayer:YES];

【讨论】:

是的,我忘了设置核心动画层。 Thx... sry 是 Cocoa 的新手,我从来没有尝试过子类化;D【参考方案2】:

我遵循了上面的建议(谢谢!),但不幸的是,当调整 NSProgressIndicator 的大小时,它消失了,但仅在第一次查看时消失了(它在抽屉里)。

我意识到您实际上并不需要旧控件,而不是尝试了解发生了什么,因为我所做的非常简单(改变颜色的强度指示器)。只需创建一个 NSView 的子类。

原来如此:

@interface SSStrengthIndicator : NSView
/// Set the indicator based upon a score from 0..4
@property (nonatomic) double strengthScore;
@end

@implementation SSStrengthIndicator
- (void)setStrengthScore:(double)strength

    if (_strengthScore != strength) 
        _strengthScore = strength;
        [self setNeedsDisplay:YES];
   


- (void)drawRect:(NSRect)dirtyRect

    NSRect rect = NSInsetRect([self bounds], 1.0, 2.0);
    double  val = (_strengthScore + 1) * 20;
    if (val <= 40)
        [[NSColor redColor] set];
    else if (val <= 60)
        [[NSColor yellowColor] set];
    else
        [[NSColor greenColor] set];

    rect.size.width = floor(rect.size.width * (val / 100.0));
    [NSBezierPath fillRect:rect];

@end

【讨论】:

以上是关于子类 NSProgressIndicator的主要内容,如果未能解决你的问题,请参考以下文章

java 子类强转父类 父类强转子类

子类调用父类static方法怎么获得子类类名

子类可以直接调用父类的函数吗

子类从父类继承过来的方法可以操作子类自己定义的成员变量吗

子类可以继承父类的啥

java: Set类及子类:TreeSet有序子类,HashSet无序子类