記事一覧

スライダーのレールの方

さて、レールの方だ。
オーバーライドするセレクタは drawBarInside: ということで、あとの要領自体はノブとだいたい同じだった。
Cocoa的にはレールじゃなくてバーって呼ぶみたいね。

サイズはどうやら完全な任意指定はできないみたいですねえ。
横サイズは InterfaceBuilder 上で横に引っ張れば任意の大きさにできるけど、縦サイズは mini/small/regular の3種類から選ぶしかないみたい。好きなサイズでやりたければ NSCell を直接継承して好きにやりなさいってことかな??
いずれにしても、そのサイズが引数 aRect に渡ってきます。

ちなみに、横サイズは 133px が標準的っぽい雰囲気ですかね。Audio Unit Effect with Cocoa UI のテンプレートに入ってたスライダーが 133px なのと、GarageBand の Generic UI が 133px でした。縦サイズはテンプレートの方が Regular で、GarageBand は Small のようです。

-(void)drawBarInside:(NSRect)aRect flipped:(BOOL)flipped
{
NSBundle *bundle = [NSBundle bundleWithIdentifier : @"com.MyCompany.audiounit.MyGreatPlugin"];
NSString *path = [bundle pathForImageResource:@"sliderRail.png"];
NSImage* img = [[[NSImage alloc] initByReferencingFile:path] autorelease];
[img drawInRect:aRect
fromRect:NSMakeRect(0,0,[img size].width,[img size].height)
operation:NSCompositeSourceOver
fraction:1.0];
}

スライダー画像のカスタマイズ

やっとツマミの方の画像をカスタマイズできたぞ!!!
NSSliderじゃなくてNSSliderCellの方をいじるわけですね。そして、単に setImage 的なものを呼ぶんじゃなくて drawKnob なるセレクタをオーバーライドしないといけない。さらに初心者にやさしくない bundle を絡めた画像指定。
・・・ハードル高杉!!!

/* MyGreatPlugin_CocoaView.h */

@interface MySliderCell : NSSliderCell
{
}
-(void)drawKnob:(NSRect)knobRect;

/* MyGreatPlugin_CocoaView.m */

@implementation MySliderCell

-(void) drawKnob:(NSRect)knobRect
{
NSBundle *bundle = [NSBundle bundleWithIdentifier : @"com.MyCompany.audiounit.MyGreatPlugin"];
NSString *path = [bundle pathForImageResource:@"MySliderKnobImage.png"];
NSImage* img = [[[NSImage alloc] initByReferencingFile:path] autorelease];
[[self controlView] lockFocus];
[img drawInRect:knobRect
fromRect:NSMakeRect(0,0,[img size].width,[img size].height)
operation:NSCompositeSourceOver
fraction:1.0];
[[self controlView] unlockFocus];
}

これを記述してセーブすると Interface Builder の方でスライダーセルのクラスとして MySliderCell が選択できるようになるので、それを選択するとやっとソースと.xibが結びつきます。

さて次は、knobRectの大きさの設定と、レールの方の画像設定だな・・・。