У меня есть приложение для Mac, использующее IKImageBrowserView. Я создал подкласс 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];
}];
}
Вот проблема, с которой я столкнулся: загрузка продолжается, наблюдаемый объект запускает наблюдатель (поэтому вызываетсяObservValueForKeyPath) и вызывается setNeedsDisplay. Я проверил это, зарегистрировавшись с помощью сообщений NSLog.
А вот метод рисования:
- (void)drawLayer:(CALayer *)theLayer
inContext:(CGContextRef)theContext
{
NSLog(@"Drawing");
// Drawing happens here
}
Что я вижу, так это то, что рисунок начинается нормально - печать «Обновление» и «Рисунок» чередуются, но через короткое время «Рисунок» останавливается, и продолжаются только сообщения «Обновить».
Если я щелкну в браузере изображений или нажму клавишу на клавиатуре, «Рисунок» возобновится на короткое время, а затем остановится, вернувшись к просто «Обновить».
Это похоже на то, что мне нужно вызвать перерисовку с помощью клавиатуры или мыши - setNeedsDisplay этого не делает - но я не понимаю, почему. Он работает в течение короткого времени, перестает работать, а затем работает только тогда, когда я ввожу ввод с помощью мыши.
Это меня сбило с толку. Буду признателен за любые предложения.