В любом случае я могу увеличить ширину полосы?
Тем не менее, набор данных с одной сущностью работает довольно хорошо:
Привет @zykis :
Прежде всего установите barWidth для BarChartDataSet:
chartData.barWidth = defaultbarwidth // I Put is as 0.4
Затем вы можете создать выход для ширины ограничения диаграммы следующим образом:
(Перетащите из раскадровки)
<strong i="12">@IBOutlet</strong> weak var layoutBarChartWidth: NSLayoutConstraint!
Затем вы можете установить ширину диаграммы в соответствии с объемом имеющихся данных.
let dataBars = <YOUR DATA OBJECTS>
let realBarWidth = 20.0
// Chart Width:
let fullWidth = CGFloat(realBarWidth*Double(dataBars.count))
layoutBarChartWidth.constant = max(fullWidth, view.frame.size.width)
Надеюсь это поможет :-)
Спасибо, @hernanarber !
Я попробую сегодня вечером, но еще остались вопросы:
1) Я не могу найти свойство barWidth в классе BarChartDataSet. Даже просмотр файла IBarChartDataSet.swift показывает только «barBorderWidth», «barBorderColor» и т. Д. Может быть, он был удален из нового API?
2) Я объявил IBOutlets различных объектов пользовательского интерфейса в моей раскадровке, но что касается NSLayoutConstraint. Как его можно на самом деле перетащить ctrl из раскадровки, если это не наследник UIView? Я имею в виду, если я перетащу любую точку BarChartView, удерживая Ctrl, IB предложит мне создать только выход BarChartView.
Свойство .barWidth не является частью ChartDataSet, но является частью BarChartData :-)
let chartData = BarChartData(dataSet: chartDataSet)
Попытайся
Для ограничения Перейдите в EXPLORER в раскадровке, чтобы вы могли Ctrl + перетащить ограничение
@hernanarber о, чувак!
Большое спасибо!!
Я попробую это решение сегодня
установка видимого диапазона - это то, что вы хотите
оформить заказ BarLineChartViewBase.swift
open func setVisibleXRange(minXRange: Double, maxXRange: Double)
@aelam О, спасибо! Я попробую это.
Хотя этот метод внутренне оценивает minScale и maxScale для viewportHandler.
Я думаю, что лучший способ справиться с таким поведением - это понять, где оцениваются эти значения (barWidth).
@aelam Не могли бы вы объяснить мне об этом
Думаю, это то, что нам нужно ....
Спасибо :-)
@hernanarber
/// Limits the maximum and minimum value count that can be visible by pinching and zooming.
///
/// e.g. minRange=10, maxRange=100 no less than 10 values and no more that 100 values can be viewed
/// at once without scrolling.
///
/// If you call this method, chart must have data or it has no effect.
open func setVisibleXRange(minXRange: Double, maxXRange: Double)
{
let minScale = _xAxis.axisRange / maxXRange
let maxScale = _xAxis.axisRange / minXRange
_viewPortHandler.setMinMaxScaleX(
minScaleX: CGFloat(minScale),
maxScaleX: CGFloat(maxScale))
}
Вот что сообщает нам источник
можно закрыть сейчас
Что ж, BarChartData.barWidth здесь не помогает.
Манипуляции с setXVisibleRange тоже не могут изменить ситуацию. Я считаю, что это связано с огромными значениями x временных меток. Есть идеи, где это рассчитано в источниках?
Метки времени используются с 1970 года.
Поиграл с ChartsDemo, он работает:
BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets];
[data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]];
data.barWidth = 1.0f;
_chartView.data = data;
У вас есть объект полной ширины только потому, что ширина вашей оси X равна 1.0. Просто совпадение.
Дело в том, что ChartBarData.barWidth - это ТОЧЕЧНОЕ значение, где ширина оси X = [dataSet xMax] - [dataSet xMin]. Вы можете проверить это, установив значения сущностей с помощью e1 (x = 0, y = 1) и e2 (x = 1000, y = 0,7) и barWidth = 1;
@zykis
Не думаю, что это хорошее решение,
Ширина полосы в процентах,
Что вам нужно сделать, так это обработать видимый диапазон xAxis.
Например,
Если xAxis visible range 0,100, а ширина полосы 0,8
Тогда полная ширина записи AN составляет chartWidth / 100, а ширина полосы в пикселях - chartWidth / 100 * barWidth.
Не думаю, что это хорошо, что вы меняете barWidth динамически. Часть dataSet один раз устанавливается, а затем выполняется. Тогда позаботьтесь о представлении. Представление определяет, насколько широкой будет полная ширина полосы. Чтобы приблизиться к этому, установите соответствующий visibleRange.
发 自我 的 iPhone
在 2017 5 月 6 日 , 上午 6:36 , zykis [email protected]写道 :
У вас есть объект полной ширины только потому, что ширина вашей оси X равна 1.0. Просто совпадение.
Дело в том, что ChartBarData.barWidth - это ТОЧЕЧНОЕ значение, где ширина оси X = [dataSet xMax] - [dataSet xMin]. Вы можете проверить это, установив значения сущностей с помощью e1 (x = 0, y = 1) и e2 (x = 1000, y = 0,7) и barWidth = 1;-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.
Я думаю, у тебя две проблемы,
Один - сделать планку шире,
Один из них - сузить планку.
Если вы хотите, чтобы планка была узкой. Вы можете попробовать установить barWidth = 0 и borderwidth = 3
发 自我 的 iPhone
在 2017 5 月 4 日 , 上午 4:34 , zykis [email protected]写道 :
В любом случае я могу предотвратить увеличение ширины полосы?
-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите чат.
Я попытался установить видимый диапазон:
barChartView.setVisibleXRange(minXRange: 0.0, maxXRange: 5.0)
Но в результате ширина полосы изменяется в зависимости от количества полосок. Я хотел получить ПОСТОЯННУЮ ширину полосы независимо от того, сколько данных было на диаграмме :-(
@aelam
На самом деле ширина полосы не в ПРОЦЕНТАХ, а в ПУНКТАХ.
BarChartRenderer. swift: 71 prepareBuffer ()
let barWidthHalf = barData.barWidth / 2.0
let left = CGFloat(x - barWidthHalf)
let right = CGFloat(x + barWidthHalf)
barRect.origin.x = left
barRect.size.width = right - left
barRect.origin.y = top
barRect.size.height = bottom - top
CGRect определяет размеры элементов в пунктах, а не в процентах. Так что это просто заблуждение.
Но поскольку рендерер вычисляет влево и вправо, как упоминалось выше, теперь у меня первая и последняя полоски разрезаны наполовину:
Угадайте, мне нужно покопаться в смещениях области просмотра и установить их равными или более, затем половину ширины полосы
Я столкнулся с той же проблемой с первой / последней полосой, разрезанной пополам, и проблемами barWidth (у меня также есть timeIntervalSince1970 как xValues.)
В конце концов получил желаемый эффект, сохранив # дней с момента первого бара как xValues; и используйте мой собственный форматировщик, чтобы преобразовать xValue обратно в String.
Надеюсь это поможет.
@zykis устанавливает xAxisMin на -0,5, если текущее minXValue равно 0, тогда оно не будет вырезано, так же, как maxValue
и единица этих -0,5, 0, 0,5 основана на точке, а не на пикселе, я говорил ранее в процентах. Но теперь я думаю, вы теперь понимаете, о чем я.
@zykis, возможно, вы можете попытаться каждый раз сохранять каждую ТОЧКУ в одних и тех же пикселях, тогда вы можете получить постоянный результат, вот что я имел в виду
@ billylo1 Хороший момент. Мне точно нужно отрезать несколько десятилетий от моего начального значения: D
double ti = [date timeIntervalSince1970];
@aelam У меня отлично сработало. Но я не могу вспомнить, когда это решение было нарушено и при каких обстоятельствах.
Мое окончательное решение исправило проблему, манипулируя значениями панели:
BarChartData* data = [[BarChartData alloc] initWithDataSet:dataSet];
double xMin = [dataSet xMin]; // seconds since 1970x
double xMax = [dataSet xMax]; // seconds since 1970 + few days
double w = MAX(1, xMax - xMin); // if we have 7 days in xaxis, then its 7 * 24 * 60 * 60
double spacing = 0.05; // 5% of barWidth
double barWidth = w / [dataSet values].count - (spacing * w / ([dataSet values].count + 1)); // actual bar width
data.barWidth = barWidth;
[_chartView setFitBars:YES];
xaxis.spaceMin = barWidth / 10.0;
xaxis.spaceMax = barWidth / 10
xaxis.xOffset = barWidth;
_chartView.data = data;
Самый полезный комментарий
@ billylo1 Хороший момент. Мне точно нужно отрезать несколько десятилетий от моего начального значения: D
double ti = [date timeIntervalSince1970];
@aelam У меня отлично сработало. Но я не могу вспомнить, когда это решение было нарушено и при каких обстоятельствах.
Мое окончательное решение исправило проблему, манипулируя значениями панели: