NSTextField sobre NSOpenGLView
-
19-09-2019 - |
Pergunta
Eu fiz uma janela com uma NSOpenGLView que estou renderização de conteúdo openGL em.
Eu quero adicionar alguns botões e campos de texto para a exibição: Eu posso adicionar NSTextFields e NSButtons usando construtor de interface (ou código), mas eles não aparecem
.NSOpenGLView está documentado como não sendo capaz de ter vistas sub, então eu então fiz o meu próprio CustomGLView derivando diretamente da NSView e implementar o código para criar e usar um NSOpenGLContext nele. Mas os subviews ainda não estão aparecendo: -. Tintas contexto OpenGL sobre eles
No Windows este problema não existe: - Windows usado para hospedar OpenGL deve ter os estilos WS_CLIPCHILDREN
e WS_CHIPSIBLINGS
definir garantindo que qualquer par, ou sub crianças (visualizações) não vai ser obscurecida pela superfície OpenGL
Como faço para obter subviews para exibir mais de um NSView isso é desenho usando OpenGL?
Solução
Você tem 2 opções:
-
Criar uma janela apenas para o campo de texto. Adicione como uma janela filho do que hospeda o ponto de vista OpenGL. Grande desvantagem é que você tem que gerenciar posicionando-a corretamente se a visão Open GL é movido.
-
Configurar sua hierarquia de vista assim:
- Layer apoiado vista
- Layer hospedagem vista cuja camada contém uma camada OpenGL
- Campo de texto
- Layer apoiado vista
Outras dicas
Basta ligar -setWantsLayer:YES
sobre os subviews do NSOpenGLView.
NSOpenGLView não pode ter subviews acordo com a documentação. Mesmo se você subclasse o NSOpenGLView, que vai mudar nada.
O que você pode fazer é criar um NSView que irá realizar tanto o NSOpenGLView eo NSTextField. Você, então, se sobrepõem-los na ordem correta para fazer um desenhar em cima do outro.
Eu não sou pesadamente em OpenGL ainda, mas é o meu entendimento de que você pode realizar o efeito visual de subviews com Quartz Extreme usando visualizações lastreados em camada; No entanto, aqueles podem ser problemática . Desde subviews não são suportados directamente, qualquer solução é susceptível de ser um hack.
Na verdade, a solução em que apontam realmente hacks uma segunda janela para aparecer sobre sua exibição OpenGL, a segunda janela mostrando os pontos de vista de cacau que você deseja.
O código a seguir (a partir do link acima) é algo que eu não testei (mais uma vez não ser um cara OpenGL por natureza - ainda), mas aparece como uma abordagem bastante inteligente:
// This is the GL Window and view you already have
glWindow = [[GLWindow alloc] initWithContentRect:windowRect];
glView = [[[GLView alloc] initWithFrame:NSMakeRect(0, 0, windowRect.size.width, windowRect.size.height)] autorelease];
[glView translateOriginToPoint:NSMakePoint(glView.bounds.size.width/2, glView.bounds.size.height/2)];
[glWindow setContentView:glView];
// And here's your transparent UI window
uiWindow = [[TransparentWindow alloc] initWithContentRect:windowRect];
uiView = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, windowRect.size.width, windowRect.size.height)] autorelease];
[uiView translateOriginToPoint:NSMakePoint(uiView.bounds.size.width/2, uiView.bounds.size.height/2)];
uiView.wantsLayer = YES;
[uiWindow setContentView:uiView];
[glWindow addChildWindow:uiWindow ordered:NSWindowAbove];
Mais uma vez, eu não testei isso, mas parece que ele vai obter o efeito visual que você deseja.
O texto pode ser processado em uma textura - Eu apenas usei isso para um projeto, fiz um monte de olhar para o código de exemplo, e, finalmente, encontrado código de demonstração GLString da Apple, que era um tesouro absoluta de como fazer:
http://developer.apple.com/library /mac/#samplecode/CocoaGL/Listings/GLString_m.html
Eu não tentei adicionar botões, mas você pode, é claro, desenhar o seu próprio e comparando as posições de eventos de clique com os de seus botões ...
Esta foi a minha solução:
1) Criar um pai NSView (vamos chamá-lo parentView ).
2) Adicionar uma Criança NSOpenGLView para parentView .
3) Adicionar uma criança adicional NSView para parentView (certifique-se este é após o OpenGLView dentro da hierarquia). Você pode adicionar TextFields adicionais, etc, para este ponto de vista.
4) No ViewController para a marca pai certeza que você chamar [parentView setWantsLayer: TRUE]; Eu fiz isso dentro de - (void) viewWillAppear
1) O NSOpenGLView pode ter um subexibição. Ele pode ter muito mesmo.
2) A razão
Este é um Bug Apple. E eles sabem sobre ele.
Você pode resolvê-lo com bastante facilidade, mesmo sem a adição de um subexibição para NSOpenGLView ...
Em Interface Builder arraste ou seja, um CustomView na tela (não a vista). E configurá-lo da maneira que você quiser, com sliders, texto e não o que. Em seguida, crie uma saída (Chamá-lo ou seja TOPVIEW) no seu controlador de exibição. Então em algum lugar em seu código ... Talvez (applicationDidFinishLaunching) adicionar esta linha ...
[_ window.contentView addSubview: _topView]; (Faça o seu posicionamento e disposição) Isso vai fazer exatamente a mesma coisa como se você tivesse arrastado-o na contentView-se dentro IB. Só ele vai chamar o danado na posição correta Z.
Você solta restrições do IB desta forma e tem que manualmente
Pode-se também apenas subclasse e CAOpenGLLayer e usar isso como um interior camada de suporte de um NSView regular. Há também é desenhado corretamente ...
Aqui é a maneira de querer fazer isso da Apple. CALayers são uma dádiva de Deus;)
Entre seguinte string ** NSOpenGLLayer ** em pesquisa e tecle enter para chegar onde está ... NSOpenGLLayer
Espero que isso ajude ....