图表:只有在棒内点击时才能获取选定的棒数据
我在我的项目中使用了https://github.com/danielgindi/Charts库。
这是完美的工作,但我想select只有当用户点击酒吧内的酒吧数据。
目前,它还会在水龙头外面返回小节数据。
当用户敲击酒吧外时,它将提供最近的酒吧数据。
我设置了这样的条形图:
_chartView.delegate = self; _chartView.drawBarShadowEnabled = NO; _chartView.drawValueAboveBarEnabled = YES; _chartView.maxVisibleValueCount = 60; ChartXAxis *xAxis = _chartView.xAxis; xAxis.labelPosition = XAxisLabelPositionBottom; xAxis.labelTextColor = [UIColor whiteColor]; xAxis.labelFont = [UIFont systemFontOfSize:20.f]; xAxis.drawGridLinesEnabled = NO; xAxis.spaceBetweenLabels = 2.0; xAxis.labelWidth = 100; ChartYAxis *leftAxis = _chartView.leftAxis; leftAxis.labelFont = [UIFont systemFontOfSize:20.f]; leftAxis.labelCount = 5; leftAxis.labelTextColor = [UIColor whiteColor]; leftAxis.valueFormatter = [[NSNumberFormatter alloc] init]; leftAxis.valueFormatter.maximumFractionDigits = 1; leftAxis.valueFormatter.negativeSuffix = @"k"; leftAxis.valueFormatter.positiveSuffix = @"k"; leftAxis.valueFormatter.positivePrefix = @"$"; leftAxis.valueFormatter.negativePrefix = @"$"; leftAxis.labelPosition = YAxisLabelPositionOutsideChart; leftAxis.spaceTop = 0.15; leftAxis.customAxisMin = 0.0; // this replaces startAtZero = YES _chartView.legend.position = ChartLegendPositionBelowChartLeft; _chartView.legend.form = ChartLegendFormSquare; _chartView.legend.formSize = 20.0; _chartView.legend.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:20.f]; _chartView.legend.xEntrySpace = 4.0; _chartView.legend.textColor = [UIColor whiteColor]; NSMutableArray *xVals = [[NSMutableArray alloc] init]; for (int i = 0; i < 12; i++) { [xVals addObject:months[i % 12]]; } NSMutableArray *yVals = [[NSMutableArray alloc] init]; NSMutableArray *yValsColor = [[NSMutableArray alloc] init]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:10 xIndex:1]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:15 xIndex:2]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:20 xIndex:3]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:45 xIndex:4]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:30 xIndex:5]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:5 xIndex:6]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:15 xIndex:7]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:22 xIndex:8]]; [yVals addObject:[[BarChartDataEntry alloc] initWithValue:32 xIndex:9]]; [yValsColor addObject:[UIColor yellowColor]]; BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithYVals:yVals label:@"Charges"]; set1.barSpace = 0.35; set1.colors = yValsColor; NSMutableArray *dataSets = [[NSMutableArray alloc] init]; [dataSets addObject:set1]; BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets]; [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:20.f]]; [data setValueTextColor:[UIColor whiteColor]]; _chartView.data = data; NSArray *arrLabelData = [NSArray arrayWithObjects:@"All", @"1/1/2016 to 9/29/2016", @"All", @"All", @"Date of Billed",nil]; NSArray *arrLabel = [NSArray arrayWithObjects:@"Ins:",@" DOS:",@" Location:",@" Provider:",@" Aging Calculation Based On:",nil]; NSMutableAttributedString *strFS = [[NSMutableAttributedString alloc] init]; UIColor *color = [UIColor yellowColor]; // select needed color NSDictionary *attrs = @{ NSForegroundColorAttributeName : color}; NSDictionary *attrsLab = @{ NSForegroundColorAttributeName : [UIColor whiteColor]}; for(int i = 0; i <arrLabelData.count; i++) { NSString *strLabData = [arrLabelData objectAtIndex:i]; NSString *strLab = [arrLabel objectAtIndex:i]; NSAttributedString *attStringLab = [[NSAttributedString alloc] initWithString:strLab attributes:attrsLab]; NSAttributedString *attStringLabData = [[NSAttributedString alloc] initWithString:strLabData attributes:attrs]; [strFS appendAttributedString:attStringLab]; [strFS appendAttributedString:attStringLabData]; } lblAttributes.attributedText = strFS;
我只想在用户点击酒吧时回应数据。
任何人有想法?请帮助我
提前致谢。
我有我的应用程序中的图表用户版本2.2.3。 试试这个实现来解决你的问题
1)将函数添加到ChartHighlighter.swift文件。
public func getBarBounds(e: BarChartDataEntry) -> CGRect { guard let set = self.chart?._data?.getDataSetForEntry(e) as? IBarChartDataSet else { return CGRectNull } let barspace = set.barSpace let y = CGFloat(e.value) let x = CGFloat(e.xIndex) let barWidth: CGFloat = 0.5 let spaceHalf = barspace / 2.0 let left = x - barWidth + spaceHalf let right = x + barWidth - spaceHalf let top = y >= 0.0 ? y : 0.0 let bottom = y <= 0.0 ? y : 0.0 var bounds = CGRect(x: left, y: top, width: right - left, height: bottom - top) self.chart?.getTransformer(ChartYAxis.AxisDependency.Left).rectValueToPixel(&bounds) return bounds }
2)更新ChartHighlighter.swift文件中的getHighlight函数。
public func getHighlight(xx: Double, y: Double) -> ChartHighlight? { let xIndex = getXIndex(x) if (xIndex == -Int.max) { return nil } let dataSetIndex = getDataSetIndex(xIndex: xIndex, x: x, y: y) if (dataSetIndex == -Int.max) { return nil } //Modification for only Bar Selection let dataSet = self.chart!.data!.getDataSetByIndex(dataSetIndex) let e = dataSet.entryForXIndex(xIndex) as! BarChartDataEntry! let rectData = getBarBounds(e) let point = CGPoint(x: x,y: y) let isPointInFrame = CGRectContainsPoint(rectData, point) if (!isPointInFrame) { return nil } //Modification for only Bar Selection return ChartHighlight(xIndex: xIndex, dataSetIndex: dataSetIndex) }
希望它会帮助你。 快乐编码
我有一个具有相同库的项目,我可以通过将ChartHighlighter.swift文件中的getHighlight函数改为以下来获得所要求的function:
/// Returns a Highlight object corresponding to the given x- and y- touch positions in pixels. /// - parameter x: /// - parameter y: /// - returns: public func getHighlight(xx: CGFloat, y: CGFloat) -> ChartHighlight? { print("y: \(y)") let xIndex = getXIndex(x) guard let selectionDetail = getSelectionDetail(xIndex: xIndex, y: y, dataSetIndex: nil) else { return nil } print("selectionDetail: \(selectionDetail.y)") if(y<selectionDetail.y) { return nil } else { return ChartHighlight(xIndex: xIndex, value: selectionDetail.value, dataIndex: selectionDetail.dataIndex, dataSetIndex: selectionDetail.dataSetIndex, stackIndex: -1) } }