我正在尝试创建一个自定义的 NSView
,用于承载一个 CALayer
层级以实现高效的显示。然后将此 NSView
嵌入到一个 NSTableCellView
中,并由 View-Based NSOutlineView
显示。
问题在于每当我展开或折叠一个项目时,所有行都会移动,但层的内容仍然显示在改变大纲之前的位置。
滚动 NSOutlineView
似乎会刷新层,然后它们会在那一点上与它们的行同步。
我已经使用 Instruments 调试了这种行为,它似乎是滚动引发了布局操作,该操作使用 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
中正确显示吗?