3

NSImageViewwithに注釈を付けたいと思いCALayerます。目的は、画像上に図形 (a CALayer) を描画し、強調表示された領域に関する情報を別のビューに表示できるようにすることです。たとえば、ユーザーが画像ビュー上に長方形を描くと、この領域の下のピクセルが拡大され、別のウィンドウに表示されます。

を使用して画像ビューの上に描画を実装する最善の方法について、一般的なアドバイスをお願いしCALayerます。ビューのサイズが変更された場合、選択領域の位置を同期したままにする、つまり、画像に対する位置を一定に保つ必要があります。

CALayer のドキュメントには、レイヤーに基づくビューについて記載されているため、少し混乱しています。

  • 「レイヤーに裏打ちされたビューを使用する場合、レイヤーを直接操作するべきではありません。代わりに、標準のビュー プログラミング プラクティスを使用する必要があります。」

    レイヤーを所有して直接操作したいので、明らかにこれは適切な選択ではありません。

レイヤ ホスティング ビューの場合、

  • 「レイヤーをホストするビューを使用する場合、描画のためにビューに依存したり、レイヤーをホストするビューにサブビューを追加したりしないでください。」

    したがって、ビューはレイヤーホスティングである必要があるようです。ただし、私の NSImageView (サブクラス) レイヤーホストを作成すると、イメージが描画されなくなりNSImageViewます-drawRect:-drawRect:レイヤーをホストするビューでは呼び出されません。また、空のときにビューでカスタム描画を行いたいと考えています。たとえば、プレースホルダー メッセージが必要-drawRect:です。

したがって、可能な解決策の 1 つは、Interface Builder で画像ビューの上に「注釈ビュー」を配置することです。つまり、それらはネストされていませんが、単に同じスペースを占有し、同じサイズを持っています。Interface Builder で z 順序を指定できるので、注釈ビューが常に一番上に表示されます。次に、注釈ビューをレイヤー ホスティングにし、画像ビューを変更しません。

これはハックのように思えるので、もっと良い方法があると確信しています。もちろん、画像ビューに注釈を描画することもできます-drawRect:が、これには多くのコードが追加されるため、代替案を検討せずにすぐに描画したくありません。

4

1 に答える 1

1

私が行った解決策は、NSImageView サブクラスのレイヤーをまったく変更しないことでした。代わりに、サブビューを NSImageView サブクラスに追加し、親と同じ境界を持つようにビューを制約してから、このサブビューをレイヤー ホスティングにしました。その後、この「注釈」ビューのレイヤーにサブレイヤーを追加できます。このようにして、NSImageView の上に注釈を付けることができます。

于 2013-07-10T14:22:44.100 に答える