首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类NSProgressIndicator

子类NSProgressIndicator
EN

Stack Overflow用户
提问于 2013-08-27 12:01:19
回答 2查看 1.5K关注 0票数 5

我喜欢对NSProgressIndicator进行子类化。我使用了以下代码,并在Interface中设置了子类:

代码语言:javascript
复制
- (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);

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

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

出什么事了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-06 08:42:30

看起来进度条的进度不是用drawRect:绘制的,所以仅仅覆盖drawRect:是不够的。但是,如果将进度条层作为后置,则应负责完成所有绘图。

来自文档

视图类自动为您创建支持层(如果重写,则使用makeBackingLayer ),您必须使用视图类的绘图机制。

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

代码语言:javascript
复制
- (void)awakeFromNib {
    [super awakeFromNib];
    [self setWantsLayer:YES];
}
票数 2
EN

Stack Overflow用户

发布于 2015-09-11 01:39:31

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

我没有试着去理解正在发生的事情,而是意识到你实际上并不需要旧的控制,因为我所做的非常简单(一个改变颜色的强度指示器)。只需创建NSView的子类即可。

所以这就是:

代码语言:javascript
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18464814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档