Я пытаюсь создать пользовательский NSView
, на котором размещена иерархия CALayer
для эффективного отображения. Этот NSView
затем встроен в NSTableCellView
, который отображается на основе NSOutlineView
.Layer hosting NSView в NSOutlineView
Проблема заключается в том, что всякий раз, когда я расширяю или сворачиваю элемент, все строки перемещаются, но содержимое слоя остается отображаемым в позиции, которая была до изменения контура.
Прокрутка NSOutlineView
, похоже, обновляет слои, и они повторно синхронизируют свои строки в этой точке.
Я отлаживал это поведение с помощью инструментов, и кажется, что прокрутка провоцирует операцию макета, которая обновляет слои вызовом setPosition:
, который должен был произойти при расширении или свертывании элементов.
Вот пример кода для простого уровня хостинга NSView
подкласса.
@interface TestView : NSView
@end
@implementation TestView
- (instancetype)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
CAShapeLayer* layer = [CAShapeLayer layer];
layer.bounds = self.bounds;
layer.position = CGPointMake(NSMidX(self.bounds), NSMidY(self.bounds));
layer.path = [NSBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
layer.fillColor = [NSColor redColor].CGColor;
layer.delegate = self;
self.layer = layer;
self.wantsLayer = YES;
return self;
}
@end
Я пробовал много возможных решений этой проблемы, но я не мог найти какой-либо интересный метод, который вызывается на NSView
экземпляра, который может быть переопределен для вызова [self.layer setNeedsDisplay]
или [self.layer setNeedsLayout]
. Я также пробовал различные сеттер на самом CALayer
, такие как:
layer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
layer.needsDisplayOnBoundsChange = YES;
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;
Может кто-нибудь помочь мне понять, как сделать этот дисплей слоя правильно внутри NSOutlineView
?
Спасибо за это! У меня была та же проблема (пользовательский прогрессивный счетчик с использованием слоя), а расширяющиеся/сжимающиеся ячейки не перемещали счетчик. Для меня просто нужно включить поддержку слоев на контурном представлении. После этого все было исправлено. – Kyle
Я рад, что это было полезно для вас! :) Я знаю, что долго искал этот ответ! – Dalzhim