NSRectFill без контекста приводит к предупреждениям отладки

Я пытаюсь рисовать в Objective-C с NSRect, но все примеры, которые я нахожу в сети, приводят к предупреждению в журнале вывода. Он действительно использует View, но я хотел бы видеть, что отладчик не сообщает о проблемах:).

Я читал кое-что о том, что то, что вы рисуете явно, должно быть внутри "контекста", но все статьи, которые я нахожу, в данный момент намного выше моего уровня.

Вот мой код:

- (void)drawRect:(NSRect)rect
{
    NSColor *white = [NSColor whiteColor];
    NSColor *blue = [NSColor blueColor];

    [white set];
    NSRectFill([self bounds]);

    rect = NSMakeRect(100, 100, 50, 50);
    [blue set];
    NSRectFill(rect);
}

Я получаю эти ошибки:

2 июля 16:10:49 localhost X[27220]: CGContextSetFillColorWithColor: недопустимый контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextSetStrokeColorWithColor: неверный контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextSetFillColorWithColor: недопустимый контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextSetStrokeColorWithColor: неверный контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextGetCompositeOperation: неверный контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextSetCompositeOperation: неверный контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextFillRects: неверный контекст 0x0

2 июля 16:10:49 localhost X[27220]: CGContextSetCompositeOperation: неверный контекст 0x0

В большинстве статей говорилось об использовании "NSGraphicsContext", но все они были теоретическими, и я не смог найти пример того, как заставить это работать.

Я надеюсь, что кто-то может помочь:)

1 ответ

При выполнении операций рисования вам необходимо предоставить графический контекст. Контекст - это место, в котором будет происходить рисование, как холст для рисования.

Графический контекст управляется экземпляром класса NSGraphicsContext или его низкоуровневым аналогом CoreGraphics CGContextRef, Большинство методов рисования Какао работают в текущем контексте. Если вы хотите создать собственный контекст для вашей операции рисования, вы можете получить текущий контекст, используя +[NSGraphicsContext currentContext] и установите его, используя +[NSGraphicsContext setCurrentContext:],

Но когда вы реализуете -[NSView drawRect:] Вам не нужно иметь дело с графическим контекстом. Зачем? Так как NSView автоматически создает контекст и устанавливает его в качестве текущего контекста перед вызовом вашей реализации drawRect: затем извлекает нарисованное содержимое и отображает его на экране. Очевидное предостережение: нельзя звонить drawRect: напрямую: вместо этого Cocoa будет вызывать вашу реализацию drawRect: когда ему нужно отобразить вид. Это делается автоматически. Единственное, что вы можете сделать (и нужно сделать), это сказать представлению, когда ему нужно повторно отобразить (то есть, когда его нарисованное содержимое изменяется), используя метод -[NSView setNeedsDisplay:] с параметром YES,

Другие вопросы по тегам