Отображение подкласса NSView поверх другого представления

Я пытаюсь показать пользовательский NSView поверх другого представления в приложении OS X. Это пользовательский вид. Это просто красная рамка:

@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 я вижу, что поле находится перед другим представлением и в правильном положении. Но в реальной программе этого не видно.

Также, если я сделаю это:

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

Затем он будет показан, но все остальные подвиды отсутствуют, так что это не то, что я хочу.

Что мне не хватает? Как я могу показать вид над другим видом?


person user3005567    schedule 20.11.2014    source источник
comment
Вы пытались позвонить [NSBezierPath fillRect:self.bounds]; вместо NSRectFill(self.bounds);?   -  person Sergey Kalinichenko    schedule 20.11.2014
comment
не имеет значения. Его все равно не видно   -  person user3005567    schedule 20.11.2014


Ответы (1)


По-видимому, вам нужно добавить эту строку в метод -initWithFrame вашего подкласса NSView:

self.wantsLayer = YES;

Это решило все мои проблемы с тем, что подпредставление не отображается на экране, хотя оно отображалось в представлении иерархии отладки Xcode.

person jvarela    schedule 23.08.2018