【问题标题】:Drawing a NSImage into NSView subclass将 NSImage 绘制到 NSView 子类中
【发布时间】:2010-02-06 10:25:13
【问题描述】:

到目前为止,这是我的代码(在绘图矩形中):

// 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];

而且图像没有绘制...我不知道出了什么问题。

【问题讨论】:

  • 你证明noiseBGMainView不是nil了吗?
  • NSLog 它,就像你做 URL 一样。

标签: objective-c cocoa drawing nsview


【解决方案1】:

为什么不直接使用[NSImage imageNamed:@"NoiseBGMainView.jpg"] 呢?这将为您提供图片的NSImage(如果可以找到),如果找不到,则为nilNSLog 调用的结果是什么,然后回来报告它是否正在记录 (null)

【讨论】:

  • 路径没问题,就是画的问题
  • 正要回答这个问题。 +1
  • 好吧,即使路径没问题,使用imageNamed: 会更好,因为您显示的代码每次运行时都会泄漏 NSURL 和 NSImage。
  • 另外值得一提的是,用首字母大写来命名实例并不是一个好习惯。图像变量应该命名为noiseBGMainView 或者最好是noiseBGMainImage,因为它是一个图像,而不是一个视图。见developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/…
【解决方案2】:

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

如果您的自定义 NSView 是从 nib 加载的,您也不需要任何设置代码 - 只需与 Interface Builder 建立适当的 NSView-NSImageView-NSImage(资源)连接。

【讨论】:

  • 我有这个,但它不起作用:NSImage *noiseBGMainView = [NSImage imageNamed:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]]; NSLog(@"%@", noiseBGMainView); NSImageView *bgImageView = [[NSImageView alloc] init]; [bgImageView setImage:noiseBGMainView]; [self addSubview:bgImageView]; 知道怎么了?
  • 如果您以编程方式(而不是使用 IB)设置 NSImageView,则需要给它一个非零帧。尝试更改: NSImageView *bgImageView = [[NSImageView alloc] init]; to: NSImageView *bgImageView = [[NSImageView alloc] initWithFrame: NSMakeRect(0,0,100,100)];
  • 效果很好,但我需要重复图片?
【解决方案3】:
NSURL *pathToBGImage = [[NSURL alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]];

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

因为您没有传递 URL,所以 URL 将是相对 URL,但相对 URL 需要一个基础。 URL 是一个有效的对象,但不会指向任何地方。反过来,这会导致initWithContentsOfURL: 返回nil(因为您尝试从没有基础的相对 URL 加载图像)。然后,您尝试告诉图像进行绘制,但您没有图像,因此没有任何反应。

你想要initFileURLWithPath:。 (或者类方法fileURLWithPath:,以后就不用再释放URL了。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多