2012-01-29 65 views

回答

4

至少有三種不同的方法可以做到這一點,具體取決於您需要多大的靈活性。

  1. 使用兩個y軸。將它們設置爲相同,除了將可見範圍設置爲覆蓋正值和負值。根據需要爲每一個設置labelTextStyle和/或labelFormatter

  2. 使用一個軸代表與實施-axis:shouldUpdateAxisLabelsAtLocations:委託方法。返回NO並在每個提供的位置製作自定義標籤。這適用於任何標籤政策。

    -(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; 
    } 
    
  3. 使用CPTAxisLabelingPolicyNone標籤策略。這是最靈活的,也是最重要的工作,因爲除了製作自定義標籤之外,您還必須計算刻度位置。

+0

感謝這些解決方案,在第一種方法中,我必須自己定義+ ve/-ve範圍,但我使用由核心圖定義的自動範圍來存儲給定的數據。第二種方法可以列出axis的委託名和-axis的定義:shouldUpdateAxisLabelsAtLocations:this,並且在這個委託方法中,我將如何分離+ ve軸和-ve? – utariq 2012-01-30 11:37:06

+0

查看製作標籤時的位置。用它來決定使用哪種文本樣式。 – 2012-01-30 11:55:28

+0

埃裏克,我用CPTAxisDelegate和實現-axis:shouldUpdateAxisLabelsAtLocations:這到我的.m文件,但是這種方法沒有觸發那裏。你能列出它的任何例子嗎? – utariq 2012-01-31 10:38:01