Что на самом деле делают lockFocus и unlockFocus? - PullRequest
12 голосов
/ 18 февраля 2011

Предупреждение: я новичок в какао.

Я читаю "Программирование какао для Mac OS X" от Hillegass.

На стр.301 написано:

Чтобы рисунок появился на изображении, а не на экране, сначала необходимо заблокировать фокус на изображении. Когда рисунок завершен, вы должны разблокировать фокус.

Код, который я имею внутри -(void)mouseDragged:(NSEvent *)theEvent из NSView, выглядит следующим образом:

[resizedImage lockFocus];
[sourceImage drawInRect: NSMakeRect(0, 0, resizeWidth, resizeHeight) fromRect: NSMakeRect(0, 0, originalSize.width, originalSize.height) operation: NSCompositeSourceOver fraction: 1.0];
[resizedImage unlockFocus];

Без блокировки / разблокировки это не работает, но я до сих пор точно не понимаю, что происходит.

Я вижу, что во 2-й строке кода нет упоминания о resizedImage, значит ли это, что когда я использую lockFocus, это гарантирует, что любое "рисование", которое происходит там, происходит? Может ли кто-нибудь объяснить это лучше?

Ответы [ 2 ]

18 голосов
/ 18 февраля 2011

Для рисования требуется «графический контекст». Вы заметите, что, в отличие от Core Graphics, ни один из методов рисования AppKit не принимает параметр, который указывает, где рисунок заканчивается. Вместо этого место назначения хранится глобально как [NSGraphicsContext currentContext]. Все методы рисования AppKit влияют на текущий контекст.

Основное назначение -lockFocus (как для изображений, так и для изображений) - настроить графический контекст, чтобы ваш рисунок заканчивал тем, что вы хотите.

6 голосов
/ 18 февраля 2011

Из документов для -[NSImage lockFocus]:

Этот метод устанавливает текущий контекст рисования в область внеэкранного окна, используемую для кэширования содержимого получателя.

Таким образом, существует закадровое окно, которое вы рисуете, когда рисуете на изображение.Это изображение имеет графический контекст, и lockFocus делает этот контекст текущим контекстом рисования, так что drawInRect:... использует его для рисования.Это похоже на +[NSGraphicsContext setCurrentContext].

...