Xcodeを利用すれば、実は簡単にスクリーンセーバーが作れます。
用意されているテンプレートはObjective-Cですが、設定すればSwiftで作成可能です。
macOS開発をする機会が少なくとも、iOS開発に親しんでいれば、無理なく進められるかと思います。
開発環境
・Xcode 8.3.3
・macOS Sierra 10.12.6
・Swift 3
テンプレートの準備
まずXcodeで新規プロジェクト作成ダイアログを開き、macOS>Other>Screen Saverを選択し、先に進みます。
すると、Objective-Cのテンプレートが作成されますが、
今回はSwiftで書きたいので.mファイルと.hファイルは削除し、代わりに同じ名前で.swiftファイルを作成します。
「Objective-Cと紐付けるためのBridging-headerを作成しますか?」といったダイアログが表示されますが、作成しなくて大丈夫です。
Swiftファイルの中身は以下のようにします。
削除したファイルと同様の中身です。これがテンプレートとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import Foundation import ScreenSaver class TextSaverView: ScreenSaverView { required init?(coder: NSCoder) { super.init(coder: coder) self.animationTimeInterval = 1.0 / 30.0 } override init?(frame: NSRect, isPreview: Bool) { super.init(frame: frame, isPreview: isPreview) self.animationTimeInterval = 1.0 / 30.0 } override func startAnimation() { super.startAnimation() } override func stopAnimation() { super.stopAnimation() } override func drawRect(rect: NSRect) { super.drawRect(rect) } override func animateOneFrame() { return } override func hasConfigureSheet() -> Bool { return false } override func configureSheet() -> NSWindow? { return nil } } |
メソッド名から大体想像がつくかと思いますが、
init()で初期設定を行い、drawRect()やanimateOneFrame()で描画を行います。
図形の描画
今回は、ランダムな大きさと色で矩形が描画されていくサンプルを作ります。
animateOneFrame()の中に以下のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
override func animateOneFrame() { var path: NSBezierPath var rect: NSRect! = NSRect() var size: NSSize var color: NSColor var red: CGFloat var green: CGFloat var blue: CGFloat var alpha: CGFloat size = self.bounds.size // 長方形の幅と高さをランダムに算出 rect.size = NSMakeSize( SSRandomFloatBetween( size.width / 100.0, size.width / 10.0 ), SSRandomFloatBetween( size.height / 100.0, size.height / 10.0 )); // 長方形の位置をランダムに算出 rect.origin = SSRandomPointForSizeWithinRect( rect.size, self.bounds ); path = NSBezierPath(rect: rect) // 色をランダムに算出 red = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0; green = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0; blue = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0; alpha = SSRandomFloatBetween( 0.0, 255.0 ) / 255.0; color = NSColor(calibratedRed: red, green: green, blue: blue, alpha: alpha) color.set() // 長方形の描画 if (SSRandomIntBetween( 0, 1 ) == 0){ path.fill() }else{ path.stroke() } return } |
ランダムな場所に、ランダムな大きさと色の長方形を1つ描画しています。
このanimateOneFrame()メソッドは1フレーム毎に呼ばれるため、時間経過とともに長方形が画面に広がっていくはずです。
ちなみに、drawRect()の中に書いた場合は本当に1回しか描画されません。
起動準備
では、起動の準備をしましょう。
デバッグのために数秒待つのも面倒なので、スクリーンセーバーをビルドのタイミングで起動できるようにします。
下記ScreenSaver.frameworkの中にあるScreenSaverEngine.appを
アプリケーションディレクトリにコピーします。
・/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app
次にSchemeの設定です。Edit Scheme…から以下の画面を開き、
InfoにあるExecutableへ、先ほど追加したScreenSaverEngine.appを設定します。
ArgumentsのArguments Passed on Launchに下記を設定します。
・-module “$(EXECUTABLE_NAME)”
さらに、作成したものをスクリーンセーバー用のディレクトリにコピーするため、
RunScriptの設定をします。
TARGETS>Build Phasesを開き、左の+ボタン>”New Run Script Phases”と進み、表示されるシェルに下記のコマンドを入力します。
・open -W “${CODESIGNING_FOLDER_PATH}”
長かったですが、これで設定完了です!
起動
では、コードをRunしてみましょう。
すると、下記のようにインストールを求められるので許可します。
インストールするとスクリーンセーバー設定画面が開きますが、作成しているプロジェクト名のスクリーンセーバーが選択されていることを確認し、閉じます。
するとスクリーンセーバーが開始されます!
されない場合は、アプリケーションに追加したScreenSaverEngine.appを起動してください。
もしくはターゲットを macOS 10.9 としてください。
※今回はひたすら矩形が増えていくだけで消えないので注意!
最後に
最後までお付き合いいただきありがとうございます。
iOSに比べmacOSのリファレンスは極端に少なく、描画部分など若干つまづく部分もありますが
試してみると楽しいです!簡単にスクリーンセーバーが作成できました。
GLSLの利用も可能なようなので、より高度な表現にも挑戦したいと思います。
情報セキュリティが重要視されている今だからこそ、自分だけのスクリーンセーバーで
周りと差をつけては如何でしょうか。