0

我有一个使用 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 没有这样做 - 但我不明白为什么。它确实工作了很短的时间,停止工作,然后只在我提供鼠标输入时工作。

这让我很困惑。我会很感激任何建议。

4

1 回答 1

0

我没有在这里找到问题,但我确实找到了解决方案。

使 IKImageBrowserView 单元格无效不会导致它们被重新绘制,因为 IKImageBrowserView 可能出于性能考虑不会重新绘制单元格,除非它们的版本发生变化。

我现在不是使单元格无效,而是增加 IKImageBrowserItem 返回的 imageVersion,然后使 IKImageBrowserView 无效。这可靠地重绘了项目。

于 2012-08-23T11:33:34.910 回答