使用NSBezierPath时切换行属性

时间:2010-02-02 22:34:01

标签: cocoa graphics

在使用NSBezierPath绘制不同的线条(用于图表)时,我遇到了一些非常基本的问题,即更改线条颜色/宽度。以下代码应该清楚我正在尝试做什么:

#import "DrawTest.h"

@implementation DrawTest

- (id)initWithFrame:(NSRect)frameRect
{
NSLog(@"in 'initWithFrame'...");
    if ((self = [super initWithFrame:frameRect]) != nil)
        {
    [self drawBaseline];
    [self display]; // ...NO!
    [self drawPlotline];
    }
return self;
}

- (void)drawBaseline
{
    NSRect windowRect;
    int width, height;

    windowRect = [self bounds];
    width = round(windowRect.size.width);
    height = round(windowRect.size.height);

    theLineWidth=1.0;
    [[NSColor grayColor] set];
    // allocate an instance of 'NSBezierPath'...
    path = [[NSBezierPath alloc]init];
    // draw a HORIZONTAL line...
    [path moveToPoint:NSMakePoint(0,height/2)];
    [path lineToPoint:NSMakePoint(width,height/2)];
}

- (void)drawPlotline
{
    theLineWidth=10.0;
    [[NSColor redColor] set];
    // draw a VERTICAL line...
    [path moveToPoint:NSMakePoint(100,125)]; // x,y
    [path lineToPoint:NSMakePoint(100,500)];
}

- (void)drawRect:(NSRect)rect
{
NSLog(@"in 'drawRect'...");
    // draw the path line(s)
    //  [[NSColor redColor] set];
    [path setLineWidth:theLineWidth];
    [path stroke];
}

- (void)dealloc
{
    [path release];
    [super dealloc];
}

@end

问题显然在于'drawRect'只被称为ONCE(在两个方法都运行之后),结果是所有行都出现在最后一个颜色和线宽设置中。我试过调用[self display]等,希望强制'drawRect'在两个方法调用之间重绘NSView内容,但无济于事。

有人可以提出一个基本策略来实现我想要做的事吗,拜托?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

快速回答是:在[self drawBaseline]内移动[self drawPlotline]drawRect。 此外,在更改颜色之前,您需要为每种颜色调用[path stroke]一次。所以,伪代码就像

-(void)drawRect:(NSRect)rect
{
      NSBezierPath*path1=...
      construct the path for color red...
      [[NSColor redColor] set];
      [path1 stroke]; 

      NSBezierPath*path2=...
      construct the path for color blue...
      [[NSColor blueColor] set];
      [path2 stroke]; 

}

记住:

  • [path moveToPoint:]等不会绘制路径。它只是构造对象内部的路径。构建完成后,使用[path stroke] 描述路径。

  • 此外,颜色不是NSBezierPath实例内构造的路径的属性。因此,[color set]实例中未记录NSBezierPath!这是图形上下文的属性。从概念上讲,1。构建路径。 2.将颜色设置为上下文。你顺着路走。

  • 在Cocoa中,并不是告诉系统何时绘制,何时刷新等等。 Cocoa通过调用drawRect:告诉您何时绘制。除非您自己创建离屏上下文,否则在drawRect:之外无法使用您绘制的图形上下文。所以,不要事先打扰。只需在drawRect内绘制所有内容。