CALayer рисует только события ввода

У меня есть приложение для 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 этого не делает - но я не понимаю, почему. Он работает в течение короткого времени, перестает работать, а затем работает только тогда, когда я ввожу ввод с помощью мыши.

Это меня сбило с толку. Буду признателен за любые предложения.


person stevex    schedule 21.08.2012    source источник


Ответы (1)


Я не нашел проблему здесь, но я нашел решение.

Аннулирование ячеек IKImageBrowserView не приводит к их перерисовке, потому что IKImageBrowserView, вероятно, для повышения производительности, не перерисовывает ячейки, если их версия не изменится.

Вместо того, чтобы сделать ячейку недействительной, теперь я увеличиваю значение imageVersion, возвращаемое моим IKImageBrowserItem, а затем делаю недействительным IKImageBrowserView. Это надежно перерисовывает элемент.

person stevex    schedule 23.08.2012