2

我想在 NSview 或 NSImageView 中显示图像。在我的头文件中,我有

@interface FVView : NSView
{
    NSImageView *imageView;
}
@end

这是我在实现文件中尝试做的事情:

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    (Here I get an image called fitsImage........ then I do)

    //Here I make the image
    CGImageRef cgImage = CGImageRetain([fitsImage CGImageScaledToSize:maxSize]);

    NSImage *imageR = [self imageFromCGImageRef:cgImage];
    [imageR lockFocus];

    //Here I have the view context
    CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];

    //Here I set the via dimensions
    CGRect renderRect = CGRectMake(0., 0., maxSize.width, maxSize.height);

    [self.layer renderInContext:ctx];
    [imageR unlockFocus];

    CGContextDrawImage(ctx, renderRect, cgImage);
    CGImageRelease(cgImage);
}

当我运行脚本时,我在 NSview 窗口中没有得到任何东西。完全没有错误我只是看不出我做错了什么。我在 5.1.1 中的 Xcode 版本

我正在尝试学习如何操作 CGImageRef 并在窗口或 nsview 中查看它。

谢谢你。

4

1 回答 1

4

我不太确定您的设置到底是什么。在自定义视图中绘制图像与使用NSImageView. 此外,可能(或可能不)受层支持的自定义视图与层托管视图不同。

你有很多正确的元素,但它们都混在一起了。在任何情况下,您都不必将焦点锁定在NSImage. 那是为了绘制NSImage. 此外,子类化的自定义视图NSView不必super在其-drawRect:. NSView不画任何东西。

要在自定义视图中绘制图像,请尝试:

- (void) drawRect:(NSRect)dirtyRect
{
    CGImageRef cgImage = /* ... */;
    NSSize maxSize = /* ... */;
    CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
    CGRect renderRect = CGRectMake(0., 0., maxSize.width, maxSize.height);
    CGContextDrawImage(ctx, renderRect, cgImage);
    CGImageRelease(cgImage);
}

如果您有NSImageView,那么您不需要自定义视图或任何绘图方法或代码。只需在获取图像或生成图像所需的信息时执行以下操作:

NSImageView* imageView = /* ... */; // Often an outlet to a view in a NIB rather than a local variable.
CGImageRef cgImage = /* ... */;
NSImage* image = [[NSImage alloc] initWithCGImage:cgImage size:/* ... */];
imageView.image = image;
CGImageRelease(cgImage);

如果您正在使用图层托管视图,则只需将 设置CGImage为图层的内容。同样,每当您获得图像或生成图像所需的信息时,您都会这样做。它不在-drawRect:

CALayer* layer = /* ... */; // Perhaps someView.layer
CGImageRef cgImage = /* ... */;
layer.contents = (__bridge id)cgImage;
CGImageRelease(cgImage);
于 2014-05-21T18:22:04.833 回答