2012-07-02 5 views
0

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

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

Вот мой код:

- (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); 
} 

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

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

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

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

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

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

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

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

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

Большинство статей говорили об использовании «NSGraphicsContext», но все они были теоретическими и я не мог найти пример того, как получить что работать.

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

+0

CGContextRef ctx = UIGraphicsGetCurrentContext(); Попытайтесь добавить эту строку в начале вашего метода. –

ответ

2

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

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

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

+0

+1 за то, что вы не должны называть drawRect: прямо - скорее всего, OP вызывает drawRect, получает ошибки, и это ТАКЖЕ естественно вызвано циклом рисования, поэтому все выглядит хорошо на экране. – jrturton