10

ウィンドウ全体を埋めて巨大な画像を表示するNSScrollViewがあります。次に、カスタムNSViewをスクロールビューの一部(たとえば、上位20ピクセルの高さとウィンドウ幅)にオーバーレイして、追加情報を表示したいと思います。ユーザーがスクロールビューをスクロールしても、上部のカスタムNSViewは元の位置に留まる必要があります。

私は以下を試しました:

  1. ウィンドウのサイズのNSViewのインスタンスを作成します
  2. 以前に生成されたNSViewのサブビューとしてNSScrollViewを追加します
  3. 手順1でカスタムビューをサブビューとしてNSViewに追加します

これは最初は機能し、スクロールビューが正しく表示され、カスタムNSViewも表示されます。ただし、スクロールビューの移動(スクロール)を開始するとすぐに、カスタムNSViewはNSScrollViewのコンテンツと一緒にスクロールされ、境界の外に移動すると、スクロールビューの配置されていた部分が再描画されると、最終的には表示されなくなります。 。カスタムNSViewをNSScrollViewの上に効果的に重ねて、配置されたままにする方法を教えてください。

ありがとう!

4

2 に答える 2

9

2つのオプションがあります。

まず、「スクロールにコピー」をオフにします。これは、IBで直接行うか、のメンバーにcopiesOnScrollオプションを設定することで実行できます。このオプションはデフォルトでオンになっているため、スクロールビューは「スクロール中に既存のレンダリングされた画像をコピーします(ドキュメントビューの露出部分のみを描画します)」。オフにすると、「コンテンツは毎回強制的に再描画されます」。したがって、パフォーマンスが大きな問題ではない場合は、それをオフにするだけで機能します。contentViewNSScrollView

ただし、コンテンツを毎回再描画する必要があるようにすると、スクロールビュー内で複雑な描画を行う場合に、パフォーマンスに大きな問題が発生する可能性があります。

2番目のオプションは、[スクロール時にコピー]をオンのままにして、オーバーレイビューを含むフチなしウィンドウを作成することです。NSWindowこれは、現在のウィンドウの子としてインスタンスを実際に追加して、メインウィンドウが移動すると自動的に移動するように聞こえるほど、実際にはハックではありません。

RoundTransparentWindowサンプルは、オーバーレイを含むウィンドウを作成する際に従うべき優れた例を提供します次に、NSWindowaddChildWindowを使用してメインウィンドウにアタッチします。

このアプローチでは、オーバーレイウィンドウの表示と非表示のタイミングを処理する必要があることに注意してください。親ウィンドウを最大化すると、子ウィンドウの位置が自動的に調整されない場合もあるようです。だから、あなたもそれを処理する必要があります。ただし、「コピーオンスクロール」を使用するとパフォーマンスが大幅に向上する場合があることを犠牲にしたくない場合は、これは優れたソリューションです。

于 2011-01-21T22:13:46.110 に答える
3

あなたはすでにこれに対する実用的な解決策を持っていることを知っていますが、私は最近同じことを自分で探していました、そして私はこの種のオーバーレイの簡単な解決策を提供するように見える LouisKlaassenによるLKOverlayWindowクラスに出くわしました。

CocoaDev wikiで説明されているように、Interface Builderで新しいNSWindowを作成し、それをLKOverlayWindowのインスタンスにして、アウトレットを介してNSScrollViewをアタッチするか、コードで指定する必要があります。スクロールビューにアタッチされると、LKOverlayWindowのコンテンツは、スクロールビューをオーバーレイし、移動およびサイズ変更時に追跡します(後者は、ウィンドウのアウトレットとしてNSScrollViewでのみ機能するようです)。サンプルプロジェクトは、著者によってここに提供されています。

NSScrollViewをサブクラス化する方法をとろうとしていましたが、私の場合、これははるかに簡単であることがわかりました。

于 2011-02-15T04:30:27.793 に答える