【发布时间】:2012-05-12 22:50:12
【问题描述】:
我正在自定义我的 drawRect: 方法,如果它已“加载”,则该方法用于绘制 NSImage(加载需要几秒钟的时间,因为我从 WebView 获取它),并且如果图像尚未加载,则推迟绘制图像。
- (void)drawRect:(NSRect)dirtyRect
{
NSImage *imageToDraw = [self cachedImage];
if (imageToDraw != nil) {
[imageToDraw drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
} else {
//I need help here
[self setNeedsDisplay:YES];
}
}
我的问题是如何做后者。 [self cachedImage] 如果图像不可用,则返回nil,但在接下来的几秒钟内,它可能随时可用,那时我想绘制它,因为自定义视图已经在屏幕上。
我最初的直觉是,如果图像不可用,我会尝试调用[self setNeedsDisplay:YES];,希望它会告诉 Cocoa 下次再调用drawRect(一次又一次,直到图像被绘制出来),但这不起作用。
关于我可以从这里去哪里的任何指示?
编辑:
我非常清楚 WebView 的委托方法会在 loadRequest 完全处理后触发。然而,由于应用程序其余部分的结构,使用这些将非常困难,但我想我现在会尝试以某种方式使用它们,因为目前的答案。 (另请注意,我的 drawRect: 方法的重量相对较轻,除了上面已有的代码 除了之外什么都没有。)
我目前有大约 10 多个自定义视图,每个视图都有自定义数据,要求相同的 WebView 为每个视图生成图像。同时,我从 NSCache 中获取图像(使用与每个自定义视图对应的标识符)并在它不存在或需要更新时创建它,如果它还不可用则返回 nil。因此,它不像从 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 或其他方法调用 [view setNeedsDisplay:YES] 那样简单。
【问题讨论】:
-
你到底是如何抓取这张图片的?
-
-drawRect: 不应该有副作用。它应该只根据视图的当前状态进行绘制,并且应该尽可能高效地进行绘制。在 -drawRect: 中发送 -setNeedsDisplay: 消息将导致每次通过主事件循环时都重新绘制视图。
标签: objective-c cocoa osx-lion nsview drawrect