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 メソッドでデリゲートを設定します。stopAnimation
windowWillBeginSheet
windowWillEndSheet
NSObject <NSWindowDelegate>
私はこれに何日も取り組んできましたが、OS が ScreenSaverView オブジェクトを管理する方法について何も見つけることができませんでした (これは、自分のコピーを実行してエミュレートしようとしていると思います)。
これを管理する方法について何か提案はありますか、または Apple が私が見つけられなかった場所に文書化しているかどうかは? これは、スクリーンセーバーが機能するために実際に必要というわけではありませんが、楽しいと思います (OS プレビューを使用する方法も探しましたが、configureSheet がアクティブになっている間はブロックされます)。