2010-01-07 18 views
11

Para el gráfico de mi aplicación (gráficos de líneas) no tiene sentido formatear las etiquetas de los ejes en décimas. No parecía que hubiera una forma de cambiar esto sin proporcionar etiquetas personalizadas.¿Cómo puedo tener marcas en Core Plot con etiquetas personalizadas?

Pude agregar etiquetas de ejes personalizados según el código de muestra en this answer, pero las etiquetas no tienen marcas de graduación.

¿Esto es un problema (no vi nada here) o me falta algo?

+0

Hola, ¿Cómo se las arregló para obtener algunos tics con sus etiquetas personalizadas? El mismo problema aquí, las etiquetas personalizadas están bien, pero no hay tics. Gracias, Luc – Luc

Respuesta

9

Si desea etiquetas numéricas con un formato diferente al predeterminado, cree un objeto NSNumberFormatter, configúrelo en el formato que necesite y asígnelo a la propiedad labelFormatter en el eje.

Consulte la clase CPTimeFormatter si necesita formatear las etiquetas como fechas y/o horas.

1

¡Esto funcionó para mí!

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

derivar una clase de NSNumberFormatter (por ejemplo MyFormatter) y anular stringForObjectValue:

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

A continuación, establezca la propiedad labelFormatter de su eje a una instancia de MyFormatter, por ejemplo:

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

Hice lo que me explicó pero stringForObjectValue no se llama ... – Luc

0

Usted también puede cambiar el método en una categoría como esta:

#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 
Cuestiones relacionadas