Основной график: должно ли добавление CPTPlotSpaceAnnotation к пространству графика вызывать перерисовку всего графика? - PullRequest
3 голосов
/ 19 марта 2012

Я использую Core Plot для отображения временного ряда цен.Когда пользователь касается графика, я отображаю перетаскиваемую вертикальную линию в этой точке.И временной ряд, и перетаскиваемая линия - это CPTScatterPlot объекты в пределах CPTXYGraph.Это работает довольно хорошо - производительность при перетаскивании линии по графику временных рядов приемлема.

Следующий этап - отображение цены и даты в точке, выбранной пользователем.В приложении Yahoo Stocks есть приятная функция, которая отображает цену в метке, которая перемещается так, как будто она прикреплена к вершине перетаскиваемой линии.Я попытался повторить это, используя текст, отображаемый в CPTPlotSpaceAnnotation.Это работает, но сильно влияет на производительность.После некоторых копаний я обнаружил, что CPTLayer drawInContext: вызывается несколько раз - похоже, что весь граф перерисовывается каждый раз, когда я перерисовываю текстовую метку (фактически мои журналы подразумевают, что он перерисовывается дважды).

Вот код, который рисует метку (работа в процессе).Он вызывается plotSpace:shouldHandlePointingDeviceDraggedEvent:atPoint:.

- (void)displayPriceAndDateForIndex:(NSUInteger)index atPoint:(CGPoint)pointInPlotArea
{
  NSNumber * theValue = [[self.graphDataSource.timeSeries objectAtIndex:index] observationValue];

  // if the annotations already exist, remove them
  if ( self.valueTextAnnotation ) {
    [self.graph.plotAreaFrame.plotArea removeAnnotation:self.valueTextAnnotation];
    self.valueTextAnnotation = nil;
  }

  // Setup a style for the annotation
  CPTMutableTextStyle *annotationTextStyle = [CPTMutableTextStyle textStyle];
  annotationTextStyle.color = [CPTColor whiteColor];
  annotationTextStyle.fontSize = 14.0f;
  annotationTextStyle.fontName = @"Helvetica-Bold";

  // Add annotation
  // First make a string for the y value
  NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
  [formatter setMaximumFractionDigits:2];
  NSString *currentValue = [formatter stringFromNumber:theValue];

  NSNumber *x            = [NSNumber numberWithDouble:[theDate timeIntervalSince1970]];
  NSNumber *y            = [NSNumber numberWithFloat:self.graphDataSource.maxValue];
  NSArray *anchorPoint = [NSArray arrayWithObjects:x, y, nil];

  // Then add the value annotation to the plot area
  float valueLayerWidth = 50.0f;
  float valueLayerHeight = 20.0f;
  CPTTextLayer *valueLayer = [[CPTTextLayer alloc] initWithFrame:CGRectMake(0,0,valueLayerWidth,valueLayerHeight)];

  valueLayer.text = currentValue;
  valueLayer.textStyle = annotationTextStyle;
  valueLayer.backgroundColor = [UIColor blueColor].CGColor;

  self.valueTextAnnotation  = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:self.graph.defaultPlotSpace anchorPlotPoint:anchorPoint];

  self.valueTextAnnotation.contentLayer = valueLayer;

  // modify the displacement if we are close to either edge
  float xDisplacement = 0.0;
  ...
  self.valueTextAnnotation.displacement = CGPointMake(xDisplacement, 8.0f);

  [self.graph.plotAreaFrame.plotArea addAnnotation:self.valueTextAnnotation];

  // now do the date field
  ...
}

Ожидается ли полное перерисовывание поведения?И есть ли лучший способ управления аннотацией, не разрушая ее и не создавая заново каждый раз, когда вызывается метод?

1 Ответ

1 голос
/ 20 марта 2012

Вам не нужно каждый раз уничтожать и создавать аннотации. Как только он будет создан, просто обновите anchorPoint. Удаление и добавление аннотации, вероятно, связано с постоянной перерисовкой.

...