iPodのクリックホイールのように、グルグルと円を描いて値を増減させる例です。NSViewのサブクラスで以下のような感じに。1周まわすと1.0増減します。
// // YKJogWheelView.h // #import <Cocoa/Cocoa.h> @interface YKJogWheelView : NSView { CGFloat gStartAngle; CGFloat gPreAngle; NSInteger gRotCount; } @end
// // YKJogWheelView.m // #import "YKJogWheelView.h" @implementation YKJogWheelView - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code here. } return self; } - (void)drawRect:(NSRect)rect { // Drawing code here. } - (void)setValue:(CGFloat)value { NSLog(@"value = %f", value); } - (CGFloat)getAngle:(NSEvent *)theEvent { NSPoint point = [theEvent locationInWindow]; NSRect frame = [self frame]; return -atan2(point.y - frame.origin.y - frame.size.height / 2, point.x - frame.origin.x - frame.size.width / 2) / M_PI / 2.0; } - (void)setDragEvent:(NSEvent *)theEvent { CGFloat newAngle = [self getAngle:theEvent]; if ((newAngle - gPreAngle) > 0.5) { gRotCount--; } else if ((newAngle - gPreAngle) < -0.5) { gRotCount++; } [self setValue:newAngle - gStartAngle + gRotCount]; gPreAngle = newAngle; } - (void)mouseDown:(NSEvent *)theEvent { gStartAngle = [self getAngle:theEvent]; gRotCount = 0; [self setValue:0]; } - (void)mouseDragged:(NSEvent *)theEvent { [self setDragEvent:theEvent]; } @end