Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can NSSlider be customised to provide a non-linear scale in cocoa?

How can NSSlider be customised to provide a non-linear scale in cocoa? i.e - 0, 2, 4, 6, 10.

With the slider constrained to stopping on tick marks only, I want the slider to stop on 0, 2, 4, 6, 10 (and not 8 for instance). Thanks.

like image 383
Rhys Lewis Avatar asked Apr 27 '11 21:04

Rhys Lewis


1 Answers

Quickly written example based on an array with the desired values:

SampleAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface SampleAppDelegate : NSObject <NSApplicationDelegate> {

    NSWindow * window;
    NSArray * values;

    IBOutlet NSSlider * theSlider;
    IBOutlet NSTextField * theLabel;

}

- (IBAction)sliderChanged:(id)sender;

@property (assign) IBOutlet NSWindow *window;

@end

SampleAppDelegate.h

#import "SampleAppDelegate.h"

@implementation SampleAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    values = [[NSArray alloc] initWithObjects:@"0",@"1",@"2",@"10",@"50",nil];

    [theSlider setNumberOfTickMarks:[values count]];
    [theSlider setMinValue:0];
    [theSlider setMaxValue:[values count]-1];
    [theSlider setAllowsTickMarkValuesOnly:YES];

    [theLabel setStringValue:[values objectAtIndex:0]];
    [theSlider setIntValue:0];


}

- (IBAction)sliderChanged:(id)sender {

    int current = lroundf([theSlider floatValue]);
    [theLabel setStringValue:[values objectAtIndex:current]];

}

@end

Interface Builder:
- Add NSSlider (connect IBOutlet / connect IBAction / enable continuos updating)
- Add NSTextField (connect IBOutlet)

Result:

enter image description here

like image 162
Anne Avatar answered Oct 19 '22 22:10

Anne