Контекст рисования NSView - PullRequest
       15

Контекст рисования NSView

6 голосов
/ 28 февраля 2012

Безопасно ли получить NSG CGContext от -drawRect: и использовать его для более поздней прорисовки? В таком простом тесте, как этот:

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:. Это прекрасно работает для множества случаев, но более процедурный способ рисования облегчит жизнь в моем конкретном случае.

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012

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

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

2 голосов
/ 24 декабря 2012

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

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

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

...