Как я могу иметь метки в Core Plot с пользовательскими метками? - PullRequest
11 голосов
/ 07 января 2010

Для графика моего приложения (линейные графики) не имеет смысла форматировать метки оси до десятых долей. Не похоже, что есть способ изменить это без предоставления пользовательских меток.

Мне удалось добавить пользовательские метки осей на основе примера кода в этого ответа , но метки не имеют меток.

Это проблема (я ничего не видел здесь ) или я что-то упустил?

Ответы [ 4 ]

9 голосов
/ 07 января 2010

Если вы хотите, чтобы числовые метки имели формат, отличный от формата по умолчанию, создайте объект NSNumberFormatter, установите для него любой необходимый вам формат и присвойте его свойству labelFormatter на оси.

Проверьте класс CPTimeFormatter, если вам нужно отформатировать метки как даты и / или время.

4 голосов
/ 20 июня 2010

Извлечение класса из NSNumberFormatter (например, MyFormatter) и переопределение stringForObjectValue:

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

Затем установите для свойства labelFormatter вашей оси экземпляр MyFormatter, например:

MyFormatter *formatter = [[MyFormatter alloc] init];
x.labelFormatter = formatter;
[formatter release];
1 голос
/ 28 мая 2010

Это сработало для меня!

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:0];  
y.labelFormatter = formatter; 
0 голосов
/ 30 апреля 2014

Вы также можете поменять метод в категории, как это:

#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
...