Я делаю график в target-c, используя библиотеку core-plot, я хочу изменить цвет меток отрицательной оси? Как я могу это сделать?
Есть как минимум три разных способа сделать это, в зависимости от того, насколько вам нужна гибкость.
Используйте две оси Y. Установите их одинаково, за исключением того, что установите видимый диапазон на один, чтобы покрыть положительные значения, а другой отрицательные значения. Установите labelTextStyle и / или labelFormatter для каждого по желанию.
labelTextStyle
labelFormatter
Используйте делегат оси и реализуйте метод делегата -axis:shouldUpdateAxisLabelsAtLocations:. Верните НЕТ и сделайте пользовательские метки в каждом из указанных мест. Это работает с любой политикой маркировки.
-axis:shouldUpdateAxisLabelsAtLocations:
-(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations { static CPTTextStyle *positiveStyle = nil; static CPTTextStyle *negativeStyle = nil; NSNumberFormatter *formatter = axis.labelFormatter; CGFloat labelOffset = axis.labelOffset; NSDecimalNumber *zero = [NSDecimalNumber zero]; NSMutableSet *newLabels = [NSMutableSet set]; for ( NSDecimalNumber *tickLocation in locations ) { CPTTextStyle *theLabelTextStyle; if ( [tickLocation isGreaterThanOrEqualTo:zero] ) { if ( !positiveStyle ) { CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; newStyle.color = [CPTColor greenColor]; positiveStyle = newStyle; } theLabelTextStyle = positiveStyle; } else { if ( !negativeStyle ) { CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; newStyle.color = [CPTColor redColor]; negativeStyle = newStyle; } theLabelTextStyle = negativeStyle; } NSString *labelString = [formatter stringForObjectValue:tickLocation]; CPTTextLayer *newLabelLayer = [[CPTTextLayer alloc] initWithText:labelString style:theLabelTextStyle]; CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithContentLayer:newLabelLayer]; newLabel.tickLocation = tickLocation.decimalValue; newLabel.offset = labelOffset; [newLabels addObject:newLabel]; [newLabel release]; [newLabelLayer release]; } axis.axisLabels = newLabels; return NO; }
Используйте политику маркировки CPTAxisLabelingPolicyNone. Это наиболее гибкий, но также и самый эффективный способ, поскольку вам необходимо вычислить расположение отметок в дополнение к созданию пользовательских меток.
CPTAxisLabelingPolicyNone