今天簡書上有人問我關(guān)于 Charts 多個圖表聯(lián)動的問題, 這個問題在 MPAndroidCharts 上使用它發(fā)送的通知即可, 在 ios_charts 上就只有 delegate 去實現(xiàn)了
- (void)chartValueSelected:(ChartViewBase * __nonnull)chartView entry:(ChartDataEntry * __nonnull)entry highlight:(ChartHighlight * __nonnull)highlight {
}
- (void)chartScaled:(ChartViewBase *)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY {
}
- (void)chartTranslated:(ChartViewBase *)chartView dX:(CGFloat)dX dY:(CGFloat)dY {
}
- (void)chartValueNothingSelected:(ChartViewBase * __nonnull)chartView {
}
在 Charts 里提供了四個協(xié)議方法, 分別對應(yīng)這選擇, 縮放, 拖動和沒有選擇, 當(dāng)需要實現(xiàn)拖拽和縮放聯(lián)動時, 只需要在縮放, 拖動的協(xié)議方法下遍歷所有子視圖, 找到 ChartView 的所有對象, 獲取到 ChartView 當(dāng)前點擊的矩陣, 然后使用新的矩陣刷新一下 ChartView 即可
- (void)scaleOrTranslated:(NSArray<__kindof UIView *> *)subviews chartView:(ChartViewBase * _Nonnull)chartView {
[subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[CombinedChartView class]]) {
CombinedChartView *combinedChartView = (CombinedChartView *)obj;
CGAffineTransform srcMatrix = chartView.viewPortHandler.touchMatrix;
[combinedChartView.viewPortHandler refreshWithNewMatrix:srcMatrix
chart:combinedChartView
invalidate:YES];
}
}];
}
如果需要實現(xiàn)高亮聯(lián)動也是一樣的思路, 在高亮選中的方法下遍歷所有的子視圖, 找到 chartView 所有的對象, 將 chartView 的某點設(shè)置為高亮即可
- (void)chartViewSelected:(NSArray<__kindof UIView *> *)subviews highlight:(ChartHighlight * __nonnull)highlight {
[subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[CombinedChartView class]]) {
CombinedChartView *combinedChartView = (CombinedChartView *)obj;
[combinedChartView highlightValue:highlight];
}
}];
}
當(dāng)然可以小小的優(yōu)化下, 在快速枚舉內(nèi)判斷當(dāng)前拖拽或者選中的 chartView 的對象和枚舉拿到的對象是不是一樣, 如果一樣的話 break 就可以了
如果你還遇到什么問題, 或者有更好的思路, 可以給我留言一起討論
ps : 最近準備研究下 Realm, 過段時間會更新關(guān)于 Realm 的文章, 希望大家繼續(xù)關(guān)注