NSTextField поверх NSOpenGLView - PullRequest
       8

NSTextField поверх NSOpenGLView

11 голосов
/ 08 февраля 2010

Я создал окно с NSOpenGLView, в которое я рендерил контент openGL.

Я хочу добавить некоторые кнопки и текстовые поля в представление: я могу добавить NSTextFields и NSButton, используя построитель интерфейса (или код), но они не отображаются.

NSOpenGLView задокументирован как неспособный иметь подвиды, поэтому я затем создал свой собственный CustomGLView, напрямую выведенный из NSView и реализующий код для создания и использования в нем NSOpenGLContext. Но подпредставления все еще не появляются: - контекст OpenGL закрашивает их.

В Windows такой проблемы не существует: - Windows, используемая для размещения OpenGL, ДОЛЖНА иметь набор стилей WS_CLIPCHILDREN и WS_CHIPSIBLINGS, гарантирующий, что любой одноранговый узел или дочерние элементы (представления) не будут скрыты поверхностью OpenGL.

Как получить подвиды для отображения поверх рисунка NSView с использованием OpenGL?

Ответы [ 7 ]

6 голосов
/ 09 февраля 2010

У вас есть 2 варианта:

  1. Создать окно только для текстового поля. Добавьте в качестве дочернего окна того, в котором размещается представление OpenGL. Основным недостатком является то, что вы должны правильно позиционировать его, если перемещен вид Open GL.

  2. Настройте иерархию представления следующим образом:

    • Layer- backed view
      • Layer- хостинг представление, слой которого содержит слой OpenGL
      • Текстовое поле
5 голосов
/ 04 мая 2012

Просто позвоните -setWantsLayer:YES в подпредставлениях NSOpenGLView.

1 голос
/ 31 января 2017

1) NSOpenGLView может иметь подпредставление. Это может быть много даже.

2) Причина, по которой некоторые представления, элементы управления и другие элементы подвергаются запугиванию со стороны NSOpenGLView, связана с процессом загрузки при запуске приложения. Т.е. если вы добавите ползунок или текстовое поле выше и в представление содержимого окна, где также находится NSOpenGLView, при запуске приложения это текстовое поле, скорее всего, окажется под NSOpenGLView.

Это ошибка Apple. И они знают об этом.

Вы можете решить это довольно легко, даже не добавляя подпредставление для NSOpenGLView ...

В Интерфейсном Разработчике перетащите то есть CustomView на холст (не вид). И установите его так, как вы хотите, с помощью ползунков, текста, а что нет. Затем создайте выход (назовите его, т.е. topView) в вашем контроллере представления. Тогда где-нибудь в вашем коде ... Возможно (applicationDidFinishLaunching) добавить эту строку ...

[_ window.contentView addSubview: _topView]; (Есть ли ваше расположение и макет) Это будет делать то же самое, как если бы вы перетаскивали его в contentView внутри IB. Только это привлечет проклятую вещь в правильное положение Z.

Таким образом, вы теряете ограничения IB и должны это делать вручную

Можно также просто создать подкласс и CAOpenGLLayer и использовать его в качестве вспомогательного слоя внутри обычного NSView. Там тоже нарисовано правильно ...

Вот способ, которым Apple хочет это сделать. Cayers - находка;)

Введите следующую строку ** NSOpenGLLayer ** в поиске и нажмите Enter, чтобы добраться до места, где оно находится ... NSOpenGLLayer

Надеюсь, это поможет ....

1 голос
/ 22 мая 2016

Это было мое решение:

1) Создайте родительский NSView (назовем его parentView ).

2) Добавление дочернего элемента NSOpenGLView в parentView .

3) Добавьте дополнительный дочерний элемент NSView в parentView (убедитесь, что это после OpenGLView в иерархии). Вы можете добавить дополнительные TextFields и т. Д. Для этого представления.

4) В ViewController для родителя убедитесь, что вы вызываете [parentView setWantsLayer: TRUE]; Я сделал это в - (void) viewWillAppear

1 голос
/ 07 марта 2011

Текст может быть преобразован в текстуру - я только использовал это для проекта, много искал пример кода и в конечном итоге нашел демонстрационный код Apple GLString, который был абсолютной добычей практических рекомендаций: *

http://developer.apple.com/library/mac/#samplecode/CocoaGL/Listings/GLString_m.html

Я не пробовал добавлять кнопки, но вы, конечно, можете нарисовать свои собственные и сравнить позиции событий нажатия с позициями ваших кнопок ...

1 голос
/ 08 февраля 2010

Я пока не очень увлечен OpenGL, но, насколько я понимаю, вы можете достичь визуального эффекта подпредставлений с помощью Quartz Extreme с использованием представлений со слоистой поддержкой; однако, это может быть проблемным . Поскольку подпредставления не поддерживаются напрямую, любое решение может быть взломано.

Действительно, решение в этой ссылке фактически взламывает второе окно, которое появляется над вашим дисплеем OpenGL, второе окно, отображающее представления Какао, которые вы желаете.

Следующий код (из вышеуказанной ссылки) - это то, что я не тестировал (опять же, я не являюсь парнем из OpenGL по натуре - пока), но выглядит как довольно умный подход:

// 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];

Опять же, я не проверял это, но похоже, что он даст вам визуальный эффект, который вы желаете.

1 голос
/ 08 февраля 2010

NSOpenGLView не может иметь подпредставления в соответствии с документацией. Даже если вы создадите подкласс NSOpenGLView, это ничего не изменит.

Что вы можете сделать, это создать NSView, который будет содержать как NSOpenGLView, так и NSTextField. Затем вы накладываете их в правильном порядке, чтобы сделать одну ничью поверх другой.

...