1

Mac OS 10.6.5 で問題なく動作するかなり単純なスクリーンセーバーを作成しました。

構成画面にはかなりの数の異なるオプションが蓄積されており、configureSheet ウィンドウに独自のプレビューを実装しようとしています。これにより、ユーザー (現在は私だけ) が、各変更を OK してテストすることなく、変更の効果をすぐに確認できます。

configureSheetに を追加しNSView、Interface Builder のカスタム クラスを ScreenSaverView サブクラスに設定しました。drawRect:ビューを黒くクリアする条件を削除でき、カスタム プレビューが黒の背景で表示されなくなったため、それが起動していることがわかります。これがその関数です(インターネット上のいくつかの優れたチュートリアルに基づいています):

- (void)drawRect:(NSRect)rect
{
   if ( shouldDrawBackground ) 
   {
      [super drawRect:rect];
      shouldDrawBackground = NO;
   }
   if (pausing == NO)
      [spiroForm drawForm];
}

spiroForm クラスは、使用して ScreenSaverView フレームに自分自身を描画するだけNSBezierPathであり、前述のように、実際のスクリーンセーバーや組み込みのシステム設定プレビューでは問題になりません。カスタム プレビュー (configureView) フレームは、ええと、それ自体の init メソッドに渡されます (そのカスタム クラスは私の ScreenSaverView サブクラスであるため)。この-initWithFrameメソッドは、configureSheet オブジェクトを OS に返す前に configureSheet で呼び出されます。

[configureView initWithFrame:[configureView bounds] isPreview:YES];

多分私はそれをする必要はありませんか?絵を描くのに必要かどうか試してみただけです。

私は最終的にconfigureSheetにデリゲートを追加して、通知を介してプレビューの関数startAnimationと関数をトリガーしようとしましたが、何らかの理由でそれらが呼び出されていないようです。デリゲートは次のように宣言され、configureSheet オブジェクトを返す前に configureSheet メソッドでデリゲートを設定します。stopAnimationwindowWillBeginSheetwindowWillEndSheetNSObject <NSWindowDelegate>

私はこれに何日も取り組んできましたが、OS が ScreenSaverView オブジェクトを管理する方法について何も見つけることができませんでした (これは、自分のコピーを実行してエミュレートしようとしていると思います)。

これを管理する方法について何か提案はありますか、または Apple が私が見つけられなかった場所に文書化しているかどうかは? これは、スクリーンセーバーが機能するために実際に必要というわけではありませんが、楽しいと思います (OS プレビューを使用する方法も探しましたが、configureSheet がアクティブになっている間はブロックされます)。

4

1 に答える 1

1

OK、ソリューションにはいくつかの「当たり前」の瞬間があります。

まず、シート通知のデリゲートをシート自体に設定していました。シートが属するウィンドウが通知を受け取ります。

第二に、シートが属するそのウィンドウはシステム環境設定によって所有されています。デリゲート クラスをそのウィンドウのデリゲートとして設定する方法がわかりません。そのため、デリゲート全体が実行可能なソリューションではないようです。

makeKeyWindow メソッドと close メソッドをオーバーライドすることで、プレビューでアニメーションを開始および停止できるように、configureSheet の NSWindow をサブクラス化することになりました。

- (void) makeKeyWindow
{
   if (myPreview != nil)
      if ( ! [myPreview isAnimating])
      {
         [myPreview startAnimation];
      }
   [super makeKeyWindow];
}

また、プレビュー オブジェクト自体に IBOutlet を追加し、それを Interface Builder に接続する必要がありました。

まだいくつかの問題に取り組んでいますが、スクリーンセーバーの [オプション] ボタンをクリックすると、configureSheet がドロップダウンし、オプションの設定中に独自のプレビューが表示されます。おいおい。私がこれらの小さな細やかさのためにジャンプするフープ。とにかく、私はそれが好きです。前方および上方。

于 2011-01-16T01:22:56.570 に答える