Wie kann ich Markierungen in Core-Plot mit benutzerdefinierten Beschriftungen tick?
Frage
Für meine App-Grafik (Liniendiagramme) es ist nicht sinnvoll, die Achsenbeschriftungen auf Zehntel zu formatieren. Es sah nicht aus wie es eine Möglichkeit, dies zu ändern, ohne dass benutzerdefinierte Etiketten bereitstellt.
Ich war in der Lage individuelle Achsenbeschriftungen in auf dem Beispielcode basiert hinzufügen diese Antwort , aber die Etiketten haben keine Skalenmarkierungen.
Ist das ein Problem (ich habe nichts gesehen hier ) oder bin ich etwas fehlt?
Lösung
Wenn Sie numerische Etiketten mit einem Format wollen anders als der Standard, erstellen Sie ein NSNumberFormatter
Objekt, legen Sie es auf, was auch immer Format, das Sie brauchen, und weisen Sie auf die labelFormatter
Eigenschaft auf der Achse.
Überprüfen Sie die CPTimeFormatter
Klasse aus, wenn Sie die Etiketten wie Termine und / oder mal formatiert werden müssen.
Andere Tipps
Leiten Sie eine Klasse von NSNumberFormatter
(z.B. MyFormatter
), und überschreiben stringForObjectValue:
- (NSString *)stringForObjectValue:(NSDecimalNumber *)coordinateValue {
return @"MyLabel";
}
Dann ist die labelFormatter Eigenschaft Ihrer Achse zu einer Instanz von MyFormatter
, z.
MyFormatter *formatter = [[MyFormatter alloc] init];
x.labelFormatter = formatter;
[formatter release];
Das funktioniert für mich!
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0];
y.labelFormatter = formatter;
Sie können auch die Methode in der Kategorie wie folgt swizzle:
#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