OscillatorViewを修正する【実践的Macintoshプログラミング解説】

印刷用表示 |テキストサイズ 小 |中 |大 |

CoreData版 Repeating Motif Generator の開発 Repeating Motif Wonderland CoreData 実践的 Macintosh プログラミング解説

LinkIconホーム

更新日 2009-05-24

ビューを作る

OscillatorViewを修正する

oscillatorViewImage.png BezierPathViewをスーパークラスとする様にOscillatorViewを修正します。

インターフェイスファイルを修正する

 全てスーパークラスへ移してしまったのでOscillatorViewには何も残りません。インスタンス変数とメソッドの宣言を全て削除します。スーパークラスのインターフェイスファイルをインポートし、スーパークラスのクラス名を変更すれば完成です。

//
//  OscillatorView.h
//  RepeatingMotifGenerator
//
//  Copyright NovemberKou 2008. All rights reserved.
//

#import <Cocoa/Cocoa.h>
#import "BezierPathView.h"


@interface OscillatorView : BezierPathView
{
}

@end

用意したメソッドをオーバーライドする

 サブクラスで書き換える様に用意したメソッドkeyPathとpathHeightだけを実装すれば充分です。pathHeightは元の動作と同じになる様に、最大振幅が100になるような固定値を返します。

 keyPathはX軸のOscillatorViewが"selection.x.bezierPath"を、Y軸のOscillatorViewが"selection.y.bezierPath"を返す様にします。したがって自分がX軸のOscillatorViewなのか、Y軸のOscillatorViewなのかを見分ける方法を用意しないといけません。

 tagが使えるとよいのですが、これは残念ながらNSControlで用意されているものなのでNSViewでは使えません。したがってInterface Builderでカスタムビューを配置してもtagを設定できる様にはなりません。

 正確に言うとNSViewにもtagはあるのですが、Interface Builderのインスペクタで設定できる様になっていないと言った方がよいでしょうか。カスタムビューのタグを設定したいというニーズはあると思うのですが、なぜサポートしないのでしょう?

 しかたがないのでInterface Builderで設定できるものが何かないか探した結果、ツールチップを使う事にしました。ツールチップの最初の一文字でX軸のOscillatorViewなのか、Y軸のOscillatorViewなのかを見分ける事にします。isXViewフラグもここで設定します。

 ローカライズの時にうっかりいじると予期しない動作になるので、あまりいい方法ではないと思うのですが…

//
//  OscillatorView.m
//  RepeatingMotifGenerator
//
//  Copyright NovemberKou 2008. All rights reserved.
//

#import "OscillatorView.h"


#define     AMPLITUDE_MAX   100

@implementation OscillatorView

#pragma mark -
#pragma mark Methods to be overrided

- (NSString *)keyPath
{
    NSString    *viewName;

    viewName = [[self toolTip] substringWithRange:NSMakeRange(0,1)];    
    isXView = [viewName isEqualToString:@"x"];

    return  [NSString stringWithFormat:@"selection.%@.bezierPath",viewName];
}

- (float)pathHeight
{
    return  AMPLITUDE_MAX*2.0;
}
@end