Mac OS X 10.7.4
我使用+[NSGraphicsContext graphicsContextWithBitmapImageRep:]
方法创建了一个离屏图形上下文,并在其中绘制。
如果我使用NSBezierPath
类来绘制,所有的东西都会按照预期工作。
但是,如果我使用CGContextRef
C函数来绘制,我的绘制没有任何效果,什么也没有画出来。
出于某些原因,我非常需要使用CGContextRef
函数进行绘制(而不是Cocoa的NSBezierPath
类)。
下面是我的代码示例。我试图绘制一个简单的“X”。一条线用NSBezierPath
实现,另一条线用CGContextRef
C函数实现。第一条线可以正常显示,但第二条线却无法显示。我哪里做错了呢?
NSRect imgRect = NSMakeRect(0.0, 0.0, 100.0, 100.0);
NSSize imgSize = imgRect.size;
NSBitmapImageRep *offscreenRep = [[[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:imgSize.width
pixelsHigh:imgSize.height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0] autorelease];
// set offscreen context
NSGraphicsContext *g = [NSGraphicsContext graphicsContextWithBitmapImageRep:offscreenRep];
[NSGraphicsContext setCurrentContext:g];
NSImage *img = [[[NSImage alloc] initWithSize:imgSize] autorelease];
CGContextRef ctx = [g graphicsPort];
// lock and draw
[img lockFocus];
// draw first stroke with Cocoa. this works!
NSPoint p1 = NSMakePoint(NSMaxX(imgRect), NSMinY(imgRect));
NSPoint p2 = NSMakePoint(NSMinX(imgRect), NSMaxY(imgRect));
[NSBezierPath strokeLineFromPoint:p1 toPoint:p2];
// draw second stroke with Core Graphics. This doesn't work!
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0, 0.0);
CGContextAddLineToPoint(ctx, imgSize.width, imgSize.height);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);
[img unlockFocus];
img
。另外,你的修复方法是正确的并且解决了这个问题。感谢你的澄清! - Todd Ditchendorf