График ядра iOS: отрегулируйте отступ по оси Y для размера метки - PullRequest
2 голосов
/ 29 февраля 2012

Последние пару дней я потратил на использование Core Plot впервые.Мне потребовалось некоторое понимание того, как это работает, но я смог реализовать почти все функции, которые искал.Но, с одной стороны, я не нашел решения:

Я использую XY-график с метками на обеих осях.PlotAreaFrame имеет отступ слева, чтобы сместить plotArea вправо и создать некоторое свободное пространство для меток оси y.Это работает хорошо, если метки не слишком большие, например, для значений до 100. Но если значения y становятся больше, например.10.0000, отступов недостаточно, чтобы показать полный ярлык.

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

Есть ли какой-либо способ автоматически изменить отступы в соответствии с метками?

Ответы [ 3 ]

5 голосов
/ 02 октября 2012

Андрей,

Я понимаю, что это старый вопрос, но, возможно, это полезная мысль для вас или других.Интересно, можете ли вы сделать немного лучше, чем просто угадать нужный вам размер отступа?Как насчет этого фрагмента кода:

// set up the Y axis
float minY = 0;
float maxY = 100;      // just some max value
float tickLength = 10; // just a pleasing value
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(minY) length:CPTDecimalFromFloat(maxY)];

// set up the line style for y axis
CPTMutableLineStyle * lineStyle = [CPTLineStyle lineStyle];
lineStyle.lineColor = [CPTColor blackColor];
lineStyle.lineWidth = 2.0f;  // just picked a pleasing value

// set up the y axis
axisSet = [[CPTXYAxisSet alloc]init];
axisSet.yAxis.majorTickLength = tickLength;

// Now you can determine the size of the rectangle needed to display axis and labels by getting
// the axis font and measureing how many pixels were needed to draw the maximum Y axis label.

UIFont * font = [UIFont fontWithName:axisSet.yAxis.labelTextStyle.fontName size:axisSet.yAxis.labelTextStyle.fontSize];
NSString * maxYLabel = [axisSet.xAxis.labelFormatter stringFromNumber:[NSNumber numberWithDouble:plotSpace.yRange.maxLimitDouble] ];
CGSize textSize = [maxYLabel sizeWithFont:font];

// The offset you are looking for can now be computed by:
textSize.width + axisSet.yAxis.majorTickLength + axisSet.yAxis.labelOffset;

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

2 голосов
/ 27 марта 2012

Не получив ответа, я просмотрел всю сеть, но ответа там тоже не нашел.Решение, которое теперь работает для меня, - это просто проверить текущий диапазон оси Y, посмотреть, сколько цифр имеет значение, и вручную вычислить необходимую ширину:,Но лучше, если фиксированные отступы слишком велики для небольших чисел и слишком малы для больших чисел ...

1 голос
/ 08 сентября 2017

Сначала я использовал предложенное Yohst решение.Но потом я понял, что иногда большее число для максимального диапазона не приведет к увеличению метки, например, когда значение Y является временем (как на скриншоте ниже).1005 *

Итак, я перебрал метки оси, чтобы найти максимальную ширину метки и установить ее как отступ слева от графика:

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)_graph.axisSet;
CPTXYAxis *yAxis = axisSet.yAxis;
[yAxis relabel];
CGFloat maxLabelWidth = 0;
for (CPTAxisLabel *label in yAxis.axisLabels) {
  maxLabelWidth = MAX(maxLabelWidth, label.contentLayer.bounds.size.width);
}
_graph.plotAreaFrame.paddingLeft = /* extra padding + */ maxLabelWidth;
// force update axes because of the new padding
[axisSet relabelAxes];
[axisSet setNeedsLayout];
...