Масштабирование осей в CorePlot - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть приложение, в котором я использую CorePlot для построения графика. Я реализовал масштабирование самого графика жестами, но я все еще не могу сделать так, чтобы метки рядом с осью (которые содержат числа, такие как 1, 2 и т. Д.) Правильно масштабировались, поэтому вместо 1 основной интервал меняется на 5 или 0,5 (или любое другое число) в зависимости от жеста щепотки.

-(void) viewDidAppear
{   
UIPinchGestureRecognizer* rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)];
// set options for this recognizer.
[self.view addGestureRecognizer:rec];

...
xMajorInterval = 1;
yMajorInterval = 1;

axisSet = (CPXYAxisSet *)graph.axisSet;

axisSet.xAxis.majorIntervalLength = CPDecimalFromFloat(xMajorInterval);
axisSet.xAxis.minorTicksPerInterval = 4;
axisSet.xAxis.minorTickLength = 4.0f;
axisSet.xAxis.majorTickLength = 8.0f;
axisSet.xAxis.labelOffset = 1.0f;

axisSet.yAxis.majorIntervalLength = CPDecimalFromFloat(yMajorInterval);
axisSet.yAxis.minorTicksPerInterval = 4;
axisSet.yAxis.minorTickLength = 4.0f;
axisSet.yAxis.majorTickLength = 8.0f;
axisSet.yAxis.labelOffset = 1.0f;




...


}

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer {

//Here I tried to change xMajorInterval and yMajorInterval and redraw axes


}

Вот как я масштабирую сюжет

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer {

if (PlotSpaceX > -0.1) {

if ([gestureRecognizer scale] > 1) {

    PlotSpaceY = PlotSpaceY - 0.1;
    PlotSpaceX = PlotSpaceX - 0.1;

}
}

if (PlotSpaceY >= -0.1) {
if ([gestureRecognizer scale] < 1){

    PlotSpaceY = PlotSpaceY + 0.1;
    PlotSpaceX = PlotSpaceX + 0.1;
}
}

plotSpace.xRange = [CPPlotRange plotRangeWithLocation:plotSpace.xRange.location length:CPDecimalFromFloat(PlotSpaceX * 2.0)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:plotSpace.yRange.location length:CPDecimalFromFloat(PlotSpaceY * 2.0)];
majorInterval = majorInterval*PlotSpaceX/4;

intMajorInterval = majorInterval;
NSLog(@"%i", intMajorInterval);
axisSet.xAxis.majorIntervalLength = CPDecimalFromInt(intMajorInterval);
axisSet.yAxis.majorIntervalLength = CPDecimalFromInt(intMajorInterval);


}

В методе scalePiece я попытался изменить оси xMajorInterval и yMajorInterval и перерисовать, но, к сожалению, этот метод вызывается так часто во время жеста повышения, что метки просто отображают огромные числа.

Можете ли вы помочь мне, пожалуйста?

1 Ответ

3 голосов
/ 22 февраля 2011

Кажется, что ответ на этот вопрос зависит от того, как вы выполняете масштабирование самого графика.

В основном вам нужно масштабировать majorIntervalLength так же, как вы масштабируете диапазоны.для вашего участкаТо есть, если вы расширите диапазон в 2 раза, вы также захотите изменить значение majorIntervalLength в два раза по сравнению с его текущим значением.Если вы расширите на 1.1, вы умножите текущее значение majorIntervalLength на 1.1, а затем установите majorIntervalLength на это новое значение.

Если вы разместите свой код для масштабирования графика, я могу дать более подробный ответ с некоторымикод.

[ОБНОВЛЕНИЕ] После просмотра вашего кода.Я бы порекомендовал следующие изменения

перед обновлением PlotSpaceX:

intervalScale = (PlotSpaceX + 0.1 / PlotSpaceX)

, затем обновите majorInterval следующим образом

majorInterval = majorInterval*intervalScale

Это должно масштабировать интервал оситочно так же, как ваша координата х.

...