11

私は少し混乱しています。Appleのドキュメントには次のように記載されています。

注:パフォーマンス上の理由から、Cocoaは兄弟ビュー間でクリッピングを強制したり、兄弟ビューがオーバーラップしている場合の正しい無効化と描画動作を保証したりしません。ビューを別のビューの前に描画する場合は、フロントビューをリアビューのサブビュー(または子孫)にする必要があります。

したがって、これによれば、兄弟ビューは重複してはなりません。そうでない場合、動作は未定義です。

ただし、Cocoa Slidesデモアプリでは、レイヤーに裏打ちされたNSView兄弟が重複しており、正常に機能しているようです。

ココアスライドのスクリーンショット

それで、Cocoa Slidesのサンプルコードは間違っていて、それが機能するのは偶然の一致ですか、それともドキュメントが古くなっていますか?10.5から古くなっています、つまり?

4

5 に答える 5

10

重なり合うビューは、Leopard以上で、レイヤーバックの有無にかかわらず正常に機能します。

于 2012-05-23T23:20:03.617 に答える
8

いくつかの調査の結果、Appleのドキュメントは確かに時代遅れのようです。

10.5以降、レイヤーに裏打ちされたNSView兄弟はオーバーラップできます。

AppleのエンジニアであるDavidDuncanとCorbinDunnが参加した2009年のこの議論は、最終的にいくつかの明確な答えを提供します。

重複するビューはLeopardで機能しますが、それ以前は機能しません。ドキュメントは古くなっています。

私はビューのグループを持っています。それぞれのビューの中には小さなビューがたくさんあります。これらのビューは、互いに透けて見えるように、ウィンドウの同じ長方形に重ねて表示する必要があります。予備テストでは、各大きなビューを単一の背景ビューの兄弟にしました。必要に応じて、Zオーダーを再配置して、それぞれを前面に配置することを計画していました。このアプローチに将来(または現在)はありますか?

それはLeopardで動作します。

出典: http: //www.cocoabuilder.com/archive/cocoa/228191-nsview-behaves-different-on-10-4-vs-10-5.html#228983

更新ジェームズデンプシーもツイッターで返信しまし

私の理解では、10.5の時点では、レイヤーバックであるかどうかに関係なく、兄弟ビューの重複は問題ありません。

于 2012-05-23T12:37:22.590 に答える
4

レイヤーバックビューはOpenGL(Quartzコンポジターですが、各レイヤーをOpenGLテクスチャを含むポリゴンと見なすのに役立ちます)によってレイヤー化されるため、常に正しいオーバーラップがサポートされています。

CocoaBuilder / Cocoa-Devのスレッドでは、レイヤーについてはまったく触れられていません。つまり、バッキングCALayerを使用しない(つまり、ウィンドウ全体にCALayerのみを使用する)通常のNSViewについて説明します。

言及されている1つの例外は、OpenGLView(ここでもレイヤーなし)です。これは、常にウィンドウの上部にOpenGL長方形を合成し、サブビューをすべて消去します。NSOpenGLViewレイヤーに裏打ちされた作品を作ることはないと思いますが、代わりにOpenGLレイヤーを使用することができます。これは、他のレイヤー間で正しく合成されます。

もう1つの例外は、レイヤーに裏打ちされていないビューの上にあるレイヤーです。これは、レイヤーに裏打ちされていないすべてのビューが、もちろんそのサブレイヤー(レイヤーに裏打ちされたビューをホストしている)の下にある単一のレイヤーに効果的に存在するためです。レイヤーに裏打ちされていない親ビューでは、そうである必要があります)。

つまり、10.5以降は非レイヤーで機能し、レイヤーバックビューでは永久に機能しますが、OpenGLを組み合わせたり使用したりする場合は注意が必要です。

PS-とはいえ、レイヤーに裏打ちされていないビューの重複に関する記述を標準的なものと見なすべきかどうかは100%確信していません。これは、Appleのエンジニアによる非公式の声明です。物事が変化し、物事が機能しなくなるバグが発見された可能性があります。正しくオーバーラップさせたい場合は、通常、レイヤーを使用します。

于 2012-05-23T12:58:15.533 に答える
2

それは誰かに役立つかもしれません:MacOS10.7+で重なり合った非レイヤーサブビューのちらつきに問題がありました。私のアプリでは、ビューは選択されたグラフィックスオブジェクト(選択フレーム、スケーリングコントロールポイントなど)に関する情報をレンダリングするために使用されていたため、アニメーションがありました。私の場合はそれが重要です。

重なり合う兄弟は、レイヤーがなくても実際に正常に機能しているように見えますが、より単純なケースです。たくさんのアニメーションビューがあり、それぞれに独自のタイマーがあり、フリックしました。レイヤーをオンにするか、アニメーションを同期するか、単一の共有タイマーに切り替えるか、すべてのビューを同時に更新するかの2つの解決策を見つけました。

レイヤーを使いたくなかったので、少なくともこのトリックは私のアプリで役立ちました。

于 2013-02-19T07:56:27.950 に答える
2

NSView兄弟は、通常、オーバーラップすることが許可されています。ただし、気になるかもしれないことの1つは、NSScrollViewがデフォルトでどのように機能するかです。バニラNSScrollViewが兄弟ビューと重なっていると、問題が発生します。

これは、NSClipViewがスクロールインしているビューの部分のみを描画し、変更されていないものをコピーするためです。スクロールビューとオーバーラップする兄弟ビューがある場合、この最適化は機能せず、ビューは兄弟だけであるにもかかわらずスクロールしているように見えます。

したがって、レイヤーバックされていない場合でも重複する兄弟ビューを機能させるには、この最適化を無効にする必要があります。

[scrollView.contentView setCopiesOnScroll:NO];
于 2015-05-30T18:33:25.843 に答える