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はそれを実行していません-しかし、理由はわかりません。短時間は機能し、機能を停止し、マウス入力を提供している間のみ機能します。
これは私を困惑させました。何か提案をいただければ幸いです。