2010-02-04 57 views
0

这里是我到目前为止的代码(在抽签RECT):绘制到NSImage中的子类的NSView

// Drawing code here. 
NSLog(@"%@", [[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]); 
NSURL *pathToBGImage = [[NSURL alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]]; 
NSImage *NoiseBGMainView = [[NSImage alloc] initWithContentsOfURL:pathToBGImage]; 
[NoiseBGMainView drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 

而且图像不画......我不知道什么是错的事。

+2

您是否证明'noiseBGMainView'不是'nil'? – 2010-02-05 03:53:40

+0

我该如何检查? – nanochrome 2010-02-05 04:21:03

+1

NSLog它,就像你做URL一样。 – 2010-02-05 04:27:13

回答

4

为什么不直接使用[NSImage imageNamed:@"NoiseBGMainView.jpg"]呢?这会给你一个NSImage你的照片(如果它能找到它的话),如果它不能的话nilNSLog该调用的结果是什么,然后返回并报告是否记录(null)或不。

+0

路径一切正常,它的绘图是问题 – nanochrome 2010-02-04 22:04:26

+0

只是想回答这个问题。 +1 – 2010-02-04 22:04:37

+1

那么,即使路径正常,使用'imageNamed:'更好,因为您显示的代码每次运行时都会泄漏NSURL和NSImage。 – Kelan 2010-02-04 23:03:37

1

您可以将NSImage绘制到NSView中,无需编写任何绘图代码,只需将NSImageView附加到您的视图并将图像资源设置为NSImageView的图像即可。 (NSImageView处理所有的绘图)。

如果您的自定义NSView是从nib加载的,则不需要任何设置代码 - 只需使用Interface Builder进行相应的NSView-NSImageView-NSImage(资源)连接即可。

+0

我有这个,这是行不通的: 'NSImage * noiseBGMainView = [NSImage imageNamed:[[NSBundle mainBundle] pathForResource:@“NoiseBGMainView”ofType:@“jpg”]]; \t NSLog(@“%@”,noiseBGMainView); \t NSImageView * bgImageView = [[NSImageView alloc] init]; \t [bgImageView setImage:noiseBGMainView]; \t [self addSubview:bgImageView];' 任何想法什么是错误的? – nanochrome 2010-02-05 05:54:02

+1

如果你以编程方式设置NSImageView(而不是IB),你需要给它一个非零的框架。 尝试更改: NSImageView * bgImageView = [[NSImageView alloc] init]; 收件人: NSImageView * bgImageView = [[NSImageView alloc] initWithFrame:NSMakeRect(0,0,100,100)]; – 2010-02-05 07:06:20

+0

工程很好,但我需要重复的图像? – nanochrome 2010-02-08 01:42:20

1
NSURL *pathToBGImage = [[NSURL alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]]; 

这是错误的。 -[NSURL initWithString:]采用URL的字符串版本,例如http://apple.com/,而不是路径名。

由于您未传递网址,因此网址将是相对网址,但相对网址需要基准。该URL是一个有效的对象,但不会导致任何地方。这反过来导致initWithContentsOfURL:返回nil(因为您尝试从没有基数的相对URL加载图像)。然后,您尝试告诉图像绘制,但是您没有图像,因此没有任何反应。

你想要initFileURLWithPath:。 (或者类方法fileURLWithPath:,您不需要稍后发布URL。)