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