NSTextField上NSOpenGLView
-
19-09-2019 - |
質問
私はウィンドウとNSOpenGLView私がopenGLレンダリングコンテンツです。
たい追加ボタンやテキスト分野のビュー:て追加する事ができますNSTextFieldsとNSButtonsインタフェースでビルダー(コード)が表示されません。
NSOpenGLViewがもれなく記録されていないし、いった自分のCustomGLViewによる導出から直接NSViewの実施にコードを作成しご利用は、NSOpenGLContextます。そのsubviewsい出のOpenGL context塗料を目指します。
Windowsではこの問題が存在しない:-Windowsて使用されていOpenGLの WS_CLIPCHILDREN
や WS_CHIPSIBLINGS
スタイルの設定を確保する為、ピアまたはサブ子ども(景色は望めませんので隠されているのOpenGL。
どうやっていけばいいですか?subviewsを表示上NSView私の図面を使っOpenGL?
解決
す2つの選択肢:
作成ウィンドウのコメントを指定します。追加子として画面の一つのOpenGLます。大気の下振れは物を置くことができますの位置で正しい場合はOpen GLのビューが移転しました。
設定ビュー階層のように:
- 層担保 眺望
- 層主催 ビューする層が含まれてOpenGL層
- テキストフィールド
- 層担保 眺望
他のヒント
単にNSOpenGLViewのサブビューに-setWantsLayer:YES
を呼び出します。
NSOpenGLView マニュアルに従ってサブビューを持つことはできません。あなたがNSOpenGLViewをサブクラス化する場合であっても、それは何も変更されます。
あなたにできることはNSOpenGLViewとNSTextFieldの両方を保持するのNSViewを作成することです。あなたは、他の上に1つの引き分けを作るために、正しい順序でそれらをオーバーラップします。
私はまだOpenGLのに重くないんだけど、それはあなたがの効果のクォーツエクストリーム層担保ビューを使用してサブビューのビジュアルを実現することができる私の理解です。しかし、それらは、問題にしてもよいです。サブビューは直接サポートされないので、任意の溶液がハックになりやすい。
実際、そのリンクでのソリューションは、実際にあなたのOpenGL表示、あなたが望むのCocoaのビューを表示する第二のウィンドウの上に表示されるように第二のウィンドウをハッキング。
(上記のリンクから)次のコードは、私がテストしていませんでした何か(再び自然による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];
繰り返しますが、私はこれをテストしていませんでしたが、それはあなたが望む視覚効果を得られますように見えます。
テキストは、テクスチャにレンダリングすることができますP>
http://developer.apple.com/library /mac/#samplecode/CocoaGL/Listings/GLString_m.htmlする
...私はボタンを追加しようとしていないが、あなたは、もちろん、あなた自身やあなたのボタンのものとクリックイベントの位置を比較を描くことができます。
この溶液
1)を親NSView(う parentView).
2)を追加NSOpenGLView子 parentView.
3)加NSView子 parentView (この後のOpenGLView内の階層性).することができTextFields。ここに。
4)ViewControllerの親ただくにはコ[parentView setWantsLayer:TRUE];またこの内 -(void)viewWillAppear
1)NSOpenGLViewの のサブビューを持つことができます。それも、たくさん持つことができます。
2)の理由は、の一部のビュー、コントロールとNSOpenGLViewによっていじめされている他の要素は、ローディングプロセスアプリケーションの起動によるものです。すなわちあなたが の上にスライダーやテキストフィールドを追加し、NSOpenGLViewも存在するウィンドウのコンテンツビューに、時にそのテキストフィールドをアプリケーション起動した場合、最も可能性の高いNSOpenGLViewの下羽目になります。
これは、Appleのバグです。そして、彼らはそれについて知っています。
あなたもNSOpenGLViewにサブビューを追加することなく、非常に簡単にそれを解決することができます...
キャンバス(ませんビュー)へのCustomView即ちインタフェースビルダードラッグで。そして、スライダー、テキスト、何でないと、それをあなたがそれを望むように設定します。次に、あなたのビューコントローラに(上面図すなわちそれを呼び出す)アウトレットを作成します。そして、どこかにあなたのコードで...おそらく(applicationDidFinishLaunching)この行を追加します...
_ window.contentView addSubview:_topView]。 (自分のポジショニング&レイアウトを行います) あなたはIB内部contentView自分自身にそれをドラッグしたかのように、これはまったく同じことを行います。それだけでは正しいZ位置にくそ事を描画します。
あなたは、IBの制約をこのように緩めると
手動でする必要があります1つはまた、単にサブクラス化しCAOpenGLLayerと正規のNSViewの内部バッキング層としてこれを使用することができます。そこもそれが正しく描画されています...
ここでそれをやりたいと思っAppleのやり方です。 CALayersは天の恵みである。)
検索で**以下の文字列** NSOpenGLLayerを入力し、それがどこにあるかに到達するためにエンターキーを押し... NSOpenGLLayerする
この情報がお役に立てば幸い....