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 に答える