2012-02-27 3 views
6

Безопасно ли получить CGContext NSView от -drawRect: и использовать его, чтобы позже выполнить больше рисунков? В простом тесте, как этот:Контекст рисования NSView

CGContextRef context = NULL; 

- (void)drawRect:(NSRect)r 
{ 
    if (!context) 
     context = [[NSGraphicsContext currentContext] graphicsPort]; 
} 

- (void)drawSomething 
{ 
    CGContextSetRGBFillColor(context, 1, 0, 0, 1); 
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100)); 
    CGContextFlush(context); 
} 

все, кажется, работает, когда -drawSomething называется, но он гарантирует, что контекст не изменится?

Как вы можете видеть и можете догадаться, я пытаюсь обойти стандартный способ рисования с использованием -drawRect:. Он прекрасно работает для множества случаев, но более процедурный способ рисования облегчит жизнь в моем конкретном случае.

ответ

6

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

Если вам нужно затянуть чертеж в любой точке, вы должны позвонить display на вид, который в свою очередь вызовет drawRect:.

2

Вы должны использовать lockFocus:, если вы хотите, чтобы рисовать вне drawRect: Вот выдержка из документации NSView:

Если вы не используете дисплей ... способ нарисовать объект NSView, вы, , должны вызывать lockFocus перед вызовом методов, которые посылают команды оконному серверу и после этого должны балансировать его с сообщением unlockFocus .

Скрытие или миниатюризация окна с одним выстрелом заставляет резервное хранилище для выпустить это окно. Если вы не используете стандартный дисплей механизм для рисования, вы должны использовать lockFocusIfCanDraw, а не lockFocus, если есть шанс рисовать, в то время как окно является либо миниатюрным или скрытым.