警告:我是Cocoa新手。
我正在阅读Hillegass的“Cocoa Programming For Mac OS X”。
在p.301上写道:
要使图形显示在图像上而不是屏幕上,必须先将焦点锁定在图像上。绘图完成后,您必须解锁焦点。
我在-(void)mouseDragged:(NSEvent *)theEvent
的{{1}}内的代码如下:
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];
所以这意味着当我使用resizedImage
时,它确保在那里发生任何'绘图'吗?有人可以更好地解释一下吗?
答案 0 :(得分:18)
绘图需要'图形上下文'。您会注意到,与Core Graphics不同,AppKit绘图方法都没有采用指定绘图最终位置的参数。而是将目标全局存储为[NSGraphicsContext currentContext]
。所有AppKit绘图方法都会影响当前上下文。
-lockFocus
(在图像和视图上)的主要目的是设置图形上下文,以便您的绘图最终到达您想要的位置。
答案 1 :(得分:6)
来自-[NSImage lockFocus]
的文档:
此方法将当前绘图上下文设置为用于缓存接收者内容的屏幕外窗口区域。
因此,当您绘制到图像时,存在一个您在其上绘制的屏幕外窗口。此图像具有图形上下文,lockFocus
使此上下文成为当前图形上下文,以便drawInRect:...
将其用于绘图。它类似于+[NSGraphicsContext setCurrentContext]
。