1

私はにを持っており、NSTextViewプログラムでサブクラスをのサブビューとしてNSScrollView挿入しています。これはオーバーレイとして機能し、その下のテキストに関するグラフィック情報を重ね合わせます。NSViewNSTextViewNSView

テキストビューが右クリックに反応しないことに気付くまでは、かなりうまく機能していると思いました。他の操作(編集、選択)は問題なく機能しているようです。

また、ファーストレスポンダーがスクロールビューの兄弟(たとえば、アウトラインビュー)に変更された場合、テキストビューはクリックしてもファーストレスポンダーのステータスを取り戻しません。クリックに応じて選択範囲が変わりますが、選択範囲のハイライトは青ではなく灰色になります(テキストビューが最初の応答者ではないことを示します)。

オーバーレイサブビューのフレームをオフセットすると、テキストビューは、オーバーレイが重なっていない領域で100%正常に動作しますが、上で概説したように、重なっている領域は正しく動作しません。

Mac OS X 10.6.4でこの動作を再現する手順:

  1. 昔ながらの非ドキュメントベースのCocoaアプリを作成します。
  2. `NSTextView'IBOutletをアプ​​リデリゲート.hに追加します。
  3. NSTextViewMainMenu.xibのウィンドウにを追加します。textViewアウトレットを接続します。
  4. コードを少し入力します。

applicationDidFinishLaunching:

NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
[textView addSubview:overlay];
[overlay release];

アプリを実行し、テキスト領域の右クリックが正常に機能しないことを確認します。それでも、テキストビューを操作することはできます。

次に、xibのウィンドウにNSOutlineViewを追加します。オーバーレイが配置された状態でフォーカスがテキスト領域を離れると(アウトラインビューをクリックした場合)、フォーカスをテキストビューに戻すことはできません(再びファーストレスポンダーになることはありません)。


オーバーレイがファーストレスポンダーまたはマウスイベントを受け入れないNSTextView場合でも、がすべてのイベントを受信できるようにする方法はありますか?NSViewこれはフィールドエディタに関連しているのではないかと思います。おそらく、オーバーレイビュー宛てのイベントを無視しているのでしょうか。

4

3 に答える 3

1

おそらく、オーバーレイを、すべてのイベントとアクセシビリティメッセージをテキストビューに転送するカスタムビュークラスのインスタンスにする必要があります。また、ビュー相対座標をテキストビューの座標系に変換する必要がある場合もあります。

于 2010-10-30T00:42:51.040 に答える
0

私はそれについて多くの経験を持っていませんが、別の可能性は、オーバーレイとしてCoreAnimationレイヤーを使用することです。

于 2010-10-29T01:57:20.820 に答える
0

これを処理するクリーンな方法は、オーバーレイビューをNSViewのカスタムサブクラスにしてから、hitTest:メソッドをオーバーライドして常にnilを返すことです。これにより、オーバーレイビューがレスポンダーチェーンに参加できなくなります。代わりに、イベントは自動的にそのスーパービューまたはビュー階層の上位のビューに送信されます。また、 acceptsFirstResponderをオーバーライドして、安全のためにNOを返すこともできます(誤ってプログラムで設定された場合に備えて)。

于 2012-03-14T09:38:47.427 に答える