Переключение свойств линии при использовании NSBezierPath - PullRequest
1 голос
/ 03 февраля 2010

У меня есть некоторые очень основные проблемы с изменением цвета / ширины линии при рисовании различных линий (предназначенных для диаграммы) с 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 Ответ

4 голосов
/ 03 февраля 2010

Быстрый ответ: переместить [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. Вы устанавливаете цвет в соответствии с контекстом.3. Вы обводите путь.

  • В Какао вы не говорите системе, когда рисовать, когда обновлять и т. Д. Какао сообщает вам , когданарисуйте, позвонив вашему drawRect:.Графический контекст, на котором вы рисуете, недоступен за пределами drawRect:, если вы сами не создаете внеэкранный контекст.Так что не надо рисовать заранее.Просто нарисуйте все внутри drawRect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...