Question

For my app's graph (line plots) it does not make sense to format the axis labels to tenths. It did not look like there was a way to change this without providing custom labels.

I was able to add custom axis labels based on the sample code in this answer, but the labels do not have tick marks.

Is this an issue (I didn't see anything here) or am I missing something?

Was it helpful?

Solution

If you want numeric labels with a format different than the default, create an NSNumberFormatter object, set it to whatever format you need, and assign it to the labelFormatter property on the axis.

Check out the CPTimeFormatter class if you need to format the labels as dates and/or times.

OTHER TIPS

Derive a class from NSNumberFormatter (e.g. MyFormatter) and override stringForObjectValue:

- (NSString *)stringForObjectValue:(NSDecimalNumber *)coordinateValue {
    return @"MyLabel";
}

Then set the labelFormatter property of your axis to an instance of MyFormatter, e.g.:

MyFormatter *formatter = [[MyFormatter alloc] init];
x.labelFormatter = formatter;
[formatter release];

This worked for me!

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:0];  
y.labelFormatter = formatter; 

You can also swizzle the method in category like this:

#import "NSNumberFormatter+BigNumber.h"
#import <objc/runtime.h>

static Method origStringFromNumberMethod = nil;

@implementation NSNumberFormatter (BigNumber)

-(NSString *)stringFromBigNumber:(NSNumber*)number{
    int result = 0;
    int level = 1;
    NSString *format = @"";
    if([number integerValue] >= 1000000000) {
        level = 1000000000;
        format = @"b";
    }
    if([number integerValue] >= 1000000) {
        level = 1000000;
        format = @"m";
    }
    if([number integerValue] >= 1000){
        level = 1000;
        format = @"k";
    }
    result = [number integerValue]/level;

    NSString *kValue = [NSString stringWithFormat:@"%d%@",result,format];

    return kValue;
}

+ (void)initialize {
    origStringFromNumberMethod = class_getClassMethod(self, @selector(stringFromNumber:));
    method_exchangeImplementations(origStringFromNumberMethod,
                                   class_getClassMethod(self, @selector(stringFromBigNumber:)));
}

@end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top