再生スライダー

iPodとかQuickTimePlayerのような、再生する位置を表示・変更できるようなスライダーを使いたいと思って、NSSliderにジャカジャカ位置を送っていたら、うまいことクリックして変更できなくて、あれこれ調べたらNSSliderからNSSliderCellを取得してmouseDownFlagsってのをチェックすれば良い事が分かりました。

そこらへんを検証してみたコードが以下のような感じです。タイマーはNSEventTrackingRunLoopModeでスライダーを変更中も関係なく動かしていますが、マウスで操作中のときは値を送らないようにしています。

#import <Cocoa/Cocoa.h>

@interface Controller : NSObject {
	
    IBOutlet NSSlider *slider;
    float sliderValue;
}

- (IBAction)setValue:(id)sender;

@end

@implementation Controller

- (void)awakeFromNib
{
    [slider setMinValue:0];
    [slider setMaxValue:100];
    [slider setContinuous:NO];
	
    NSTimer *timer = 
        [NSTimer scheduledTimerWithTimeInterval:0.05
                                         target:self 
                                       selector:@selector(sendSliderValue) 
                                       userInfo:nil 
                                        repeats:YES];
	
    [[NSRunLoop currentRunLoop] addTimer:timer
        forMode:NSEventTrackingRunLoopMode];
}

- (void)sendSliderValue
{
    NSSliderCell *cell = [slider cell];

    if (![cell mouseDownFlags]) {
		
        sliderValue++;
		
        if (sliderValue > 100) {
            sliderValue = 0;
        }
		
        [slider setFloatValue:sliderValue];
    }
}

- (IBAction)setValue:(id)sender
{
    sliderValue = [sender floatValue];
}

@end

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です