gpt4 book ai didi

objective-c - 调用-setNeedsDisplay :YES from within -drawRect?

转载 作者:行者123 更新时间:2023-12-03 16:52:48 25 4
gpt4 key购买 nike

我正在自定义我的 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,但在接下来的几秒钟内,它可能会变得可用,那时我想绘制它,因为自定义 View 已在屏幕上。

我最初的直觉是如果图像不可用,尝试调用[self setNeedsDisplay:YES];,希望它能告诉Cocoa再次调用drawRect下一次(一次又一次,直到绘制图像),但这不起作用。

有什么指示可以告诉我从这里可以去哪里吗?

<小时/>

编辑:

我非常清楚 WebView 的委托(delegate)方法会在 loadRequest 完全处理后触发。然而,由于应用程序其余部分的结构,使用这些将非常困难,但我想我现在会尝试以某种方式使用它们,因为给出了当前的答案。 (另请注意,我的 drawRect: 方法相对较轻,除了我上面已有的代码之外,没有任何内容。)

我目前有大约 10 多个自定义 View ,每个 View 都有自定义数据,要求相同的 WebView 为每个 View 生成图像。同时,我从 NSCache 中获取图像(使用与每个自定义 View 对应的标识符),如果图像不存在或需要更新,则创建它,如果尚不可用,则返回 nil。因此,这并不像从 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 或其他方法调用 [view setNeedsDisplay:YES] 那么容易。

最佳答案

My initial instinct was to try calling [self setNeedsDisplay:YES]; if the image wasn't available, in hopes that it would tell Cocoa to call drawRect again the next time around (and again and again and again until the image is drawn)

即使有效,这也会非常低效。

anytime within the next few seconds it may become available and at that time I want to draw it

因此,当发生这种情况时,请调用[view setNeedsDisplay:YES]

如果您无法直接确定图像何时可用,则必须进行轮询。设置一个重复的 NSTimer ,其间隔合理,比如 0.25 秒左右。 (这也是相当低效的,但至少它每秒只运行 4 次,而不是 60 次或更糟。这是两个因素之间的权衡:您想要使用多少 CPU 和电池电量,以及两次之间的延迟有多长图像变得可用以及您显示它的时间。)

my drawRect: method is relatively light weight, there being nothing except the code I already have above.

即使你在-drawRect:中什么都不做,Cocoa仍然需要在幕后做很多工作——它需要管理脏矩形,清除窗口的适当区域。后备存储、将其刷新到屏幕等。这些都不是免费的。

关于objective-c - 调用-setNeedsDisplay :YES from within -drawRect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10567979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com