在其他视图上显示 NSView 子类

Posted

技术标签:

【中文标题】在其他视图上显示 NSView 子类【英文标题】:Showing NSView subclass over other view 【发布时间】:2014-11-20 16:18:58 【问题描述】:

我正在尝试在 OS X 应用程序中的另一个视图上显示自定义 NSView。这是自定义视图。这只是一个红框:

@interface HelpBarView : NSView

@end

@implementation HelpBarView

- (id)initWithFrame:(NSRect)frameRect

    self = [super initWithFrame:frameRect];
    if (self)
    
        NSLog(@"init");
    
    return self;


- (void)drawRect:(NSRect)dirtyRect 
    [super drawRect:dirtyRect];
    NSLog(@"draw");
    [[NSColor redColor] set];
    NSRectFill(self.bounds);


@end

要在另一个视图上显示此视图:

HelpBarView* hbv = [[HelpBarView alloc] initWithFrame:NSMakeRect(10, 20, 100, 100)];
[self.view addSubview:hbv];

这不会显示视图。但我可以从日志中看到,这两种方法都被调用了。同样在 XCode Debug View Hierarchy 中,我可以看到该框位于另一个视图的前面并且位置正确。但在实际程序中是不可见的。

如果我这样做:

[self.view setSubviews:[NSArray arrayWithObject:hbv]];

然后它会显示,但所有其他子视图都不见了,所以这不是我想要的。

我错过了什么?如何在另一个视图上方显示视图?

【问题讨论】:

您是否尝试调用[NSBezierPath fillRect:self.bounds]; 而不是NSRectFill(self.bounds); 没有区别。它仍然不可见 【参考方案1】:

显然,您需要将此行添加到您的 NSView 子类的 -initWithFrame 方法中:

self.wantsLayer = YES;

这解决了我在屏幕上没有显示子视图的所有问题,即使它显示在 Xcode 的调试层次视图中。

【讨论】:

以上是关于在其他视图上显示 NSView 子类的主要内容,如果未能解决你的问题,请参考以下文章

如何将 nib 自定义视图绑定到 NSVIew 子类

macOS 开发-NSView

NSView 子视图和类型

添加子视图到 NSView 显示,但不能删除

Cocoa NSView 子视图阻止拖放

添加为子视图的 NSView 不显示