我有一个使用 IKImageBrowserView 的 Mac 应用程序。我对 IKImageBrowserView 进行了子类化,并且从 newCellForRepresentedItem 返回了一个自定义单元格类型。
在我的单元格中,我正在从 layerForType 创建并返回一个图层:
// When asked for a foreground layer, return a new layer that we'll render the icon decorations into
- (CALayer *)layerForType:(NSString *)type {
if ([type isEqualToString:IKImageBrowserCellForegroundLayer]) {
@synchronized(self) {
if (!self.foregroundLayer) {
self.foregroundLayer = [[CALayer alloc] init];
self.foregroundLayer.delegate = self;
self.foregroundLayer.needsDisplayOnBoundsChange = YES;
[self.foregroundLayer setNeedsDisplay];
}
}
return self.foregroundLayer;
} else {
return [super layerForType:type];
}
}
我让我的单元格观察一个对象,并在它更改时在我的自定义层上调用 setNeedsDisplay。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.percentDone = (float)self.bytesSoFar/self.bytesTotal;
NSLog(@"Update");
[self.foregroundLayer setNeedsDisplay];
}];
}
这是我遇到的问题:下载继续,被观察的对象触发观察者(因此调用了observeValueForKeyPath)并调用了setNeedsDisplay。我通过使用 NSLog 消息记录来验证这一点。
但是画法:
- (void)drawLayer:(CALayer *)theLayer
inContext:(CGContextRef)theContext
{
NSLog(@"Drawing");
// Drawing happens here
}
我所看到的是绘图开始正常 - 交错打印“更新”和“绘图” - 但不久之后,“绘图”停止,只有“更新”消息继续。
如果我在图像浏览器中单击,或点击键盘上的某个键,“绘图”会恢复一会儿,然后停止,回到“更新”。
就像我需要使用键盘或鼠标触发重绘 - setNeedsDisplay 没有这样做 - 但我不明白为什么。它确实工作了很短的时间,停止工作,然后只在我提供鼠标输入时工作。
这让我很困惑。我会很感激任何建议。