6

ココア アプリケーションで、メイン ウィンドウのすぐ上にホバーするウィンドウを生成する必要があります。このメイン ウィンドウで、ユーザーが入力ボックスにテキストを入力できるようにしたいと考えています。テキスト入力ボックスが実際にフォーカスされるまでは、すべて問題ありません。メイン ウィンドウが「非アクティブ」になります。このウィンドウは縁がなく、わずかにカスタムの形状です。他の何よりもホバー カードに似ていると思います。

基本的には、これが Spotlight (Apple + Space) とほぼ同じように機能することを望んでいます。テキストを入力することはできますが、これは非常に補助的な操作であるため、より優れた UX のコンテキストでは不快感を与えたくないでしょう。メイン ウィンドウがグレー表示される (非アクティブになる)。いくつかのアプリケーションを開いてフォーカスしている場合、スポットライトによってそのアプリケーションのウィンドウが非アクティブになることはありません。

この問題が発生するのは、テキスト入力では、子ウィンドウがキー ウィンドウになる必要があるように思われるためです (テキスト入力フィールドにカーソルを置くことができません)。キーになるとメインウィンドウが非アクティブになります。

これまでのところ、私は試しました:

  • メイン アプリケーションの NSWindow をサブクラス化し、isKeyWindow をオーバーライドて、(ウィンドウではなく) アプリケーションがユーザーのフォーカスでなくなった場合にのみキーを失うようにします。これにより、子ウィンドウのキー ステータスと衝突し、キーボード入力に非常に奇妙な影響を与えるという意図しない効果がありました (削除など、一部のキーはキャプチャされません)。
  • ウィンドウの代わりにビューを作成します。この問題が原因で動作しません。最近では Webkit WebView を描画できません。

誰でも Cocoa/OSX ウィザードにアイデアはありますか? 私はこれに少し夢中になりました。掻けない痒み。

編集:子ウィンドウで以下をオーバーライドしようとしました。ウィンドウをクリックすると、メイン アプリケーション ウィンドウが非アクティブになります。

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow {
    return NO;
}

編集 2: しばらく NSMenu をいじった後、私はそのアプローチを破棄しました。しかし、私は何かを見つけたようです。NSPanel には、次のウィンドウ スタイル マスクがあります。

NSNonactivatingPanelMask
The panel can receive keyboard input without activating the owning application.
Valid only for an instance of NSPanel or its subclasses; not valid for a window.

これを試してみると…

編集 3: NSNonactivatingPanelMask はうまくいきませんでした。アイデアはありません。

4

2 に答える 2

1

必要なのは、キー ウィンドウになれるがメイン ウィンドウになれないウィンドウです。このようなクラスを自分で実装することもできますが、これは基本的に NSPanel の目的であるため、最初にそれを試してみてください。

于 2010-05-30T20:21:01.590 に答える
-1

これはあなたを助けることができると思います: [self.childWindow makeKeyAndOrderFront:self];

于 2012-03-23T06:20:32.487 に答える