Я настраиваю свой метод 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, если оно еще недоступно. Следовательно, это не так просто, как вызов [view setNeedsDisplay:YES] из - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
или другого метода.