2009-05-24波形をドラッグして発振器のパラメータを設定できる様にするアニメーションするビューを作る波形ドラッグの機能を実装するのはOscillatorViewですが、他のクラスにも変更が波及していきます。振幅と位相のずれをスライダーで設定する必要がなくなったので、それらを削除します。したがってEnclosureViewの変更が発生します。なると周波数だけスライダーを使う事もないので、一緒に削除してしまいます。スライダーを削除すると発振器のパラメータを設定するためのビューが大幅に小さくなります。そこで画面レイアウトを見直す事にしました。発振器のパラメータを設定するビューを小さくして、ミキサーを表示するビューと発振器を表示するビューの間に押し込んでしまう事にします。なるとパラメータを説明するテキストが邪魔です。このテキストがあると、そこまで小さくなりません。テキストをやめて画像で説明すれば小さくなると思ってこんな画像を作ってみましたが、これでわかってもらえるかどうか、ちょっと自信がありません。ずれです)そこで振幅なら振幅が変化するアニメーションをするビューを作る事にしました。これなら何をするパラメータなのか一目瞭然です。OscillatorParameterViewを作る発振器のパラメータをアニメーションで表すビューOscillatorParameterViewを作ります。10.4で追加されたNSAnimationクラスを使います。Animationは使いません。OscillatorParameterViewのインターフェイスファイルOscillatorParameterViewはNSViewのサブクラスとします。NSAnimationはサブクラスを作らずにそのまま使い、自分をデリゲートに指定する事で定期的にメッセージを受ける様にします。increasing行ったり来たりするアニメーションを実行したいので、値が増えているのか減っているのかを表すパラメータが必要です。increasingがYESなら値が増えている事を表します。ずれのどのアニメーションを表示するのかを表します。theAnimationNSAnimationクラスのインスタンスです。path表示に使うベジエパスです。(void)setKind:(int)aKind;@end初期化メソッドOscillatorViewをドラッグする事ができますよ、という事をアピールするため、マウスポインタがOscillatorViewの中に入ってきたらマウスカーソルの形を変える事にします。マウスカーソルの形を変えるにはNSViewのresetCursorRectsメソッドを使います。デベロッパドキュメントには以下の様に書いてあります。dealloc];}振幅パラメータを表すパス振幅を変化させるパラメータである事を表すために、正弦波の振幅が変化するアニメーションを表示します。そのために引数のaProgressに応じた大きさの振幅で描かれたベジエパスを作成し、返します。2を引いているのは線の太さ分縮めている意味で、最後に1を足しているのはセンタリングの意味です。newPath;}周波数パラメータを表すパス周波数を変化させるパラメータである事を表すために、正弦波の周波数が変化するアニメーションを表示します。そのために引数のaProgressに応じた大きさの周波数で描かれたベジエパスを作成し、返します。2を引いているのは線の太さ分縮めている意味で、最後に1を足しているのはセンタリングの意味です。newPath;}位相ずれパラメータを表すパス位相のずれを変化させるパラメータである事を表すために、正弦波の位相が変化するアニメーションを表示します。そのために引数のaProgressに応じた大きさの初期位相で描かれたベジエパスを作成し、返します。2を引いているのは線の太さ分縮めている意味で、最後に1を足しているのはセンタリングの意味です。newPath;}デリゲートメソッドを実装するプログレスマークが指定した値に達すると、animation:didReachProgressMark:メッセージが送られてきます。increasingフラグがYESなら引数のprogressをそのまま使い、NOなら逆に減っていく様に1-progressをプログレスの値として使ってアニメーション用のパスを作成します。パスはkindによって作り分けます。作成したパスをセットして、再描画して終了です。アニメーションが終了するとanimationDidEnd:メッセージが送られてきます。ここで何もしないとアニメーションを一回実行しただけで終わってしまうので、再度スタートをかけます。再スタートをかける前にincreasingフラグを反転して、アニメーションが行ったり来たりする様にします。これでムービーでいうパリンドローム再生(再生、逆再生を繰り返す)の様になります。startAnimation];}描画、アクセサメソッド後はたいした事はないので、特に説明する事はありません。startAnimation];}EnclosureViewを変更する発振器のパラメータを設定するスライダーを削除したので、EnclosureViewが変更になります。発振器のパラメータを設定するビューをミキサーのビューと発振器のビューの隙間に押し込む事にしたので、ビューがリサイズされた時の並べ替えをしているコードに追加が発生します。OscillatorParameterViewのkindを設定する作業も必要です。EnclosureViewのインターフェイスファイル発振器のパラメータを設定するビューが入ったNSBoxのアウトレットを追加します。これはビューがリサイズされた時の並べ替えをしているコードで使います。OscillatorParameterViewのアウトレットを追加します。ずれを設定するスライダーを削除するので、そのアウトレットも削除します。*)sender;@endOscillatorParamaterViewのkindを設定するawakeFromNibでアウトレットが有効になるので、ここでOscillatorParamaterViewのkindを設定します。発振器を切替える際にスライダーのバインディングを切替えているコードがありますが、そこを削除します。phaseLagKeyPath]];}リサイズ時にビューを並べ替える発振器のパラメータを設定するビューを小型化して、ミキサーのビューと発振器のビューに囲まれる位置に配置します。追加したNSBoxのアウトレットを使って配置するコードを追加します。