iOS-Charts使用相同的YAxis绘制2个图表视图

时间:2017-01-08 12:48:29

标签: ios swift charts ios-charts

我正在iOS上实现折线图,能够使用iOS Charts和Swift

比较数据

最简单的场景

比较1月4日至1月5日05日至1月6日,1月6日至1月7日等数据,等等......

所以,我需要用不同的XAxis 绘制2行(第二行是第一行的1天移位)和相同的YAxis

我做了

创建2个折线图视图(LineChartView),1包含顶部XAxis和图例;和1具有底部XAxis和图例

问题

  1. 由于XAxis标签和图例的空间,2行具有不同的YAxis位置(例如:第1行的0值约为第2行的96值)。我认为一些保证金可以解决这个问题,但我只能找到1个选项minOffset,它为所有顶部,底部,左侧和右侧设置了边距。我只能使用上边距和下边距的什么东西?

  2. 所有互动(拖动,缩放,触摸等)仅影响其中一个,而不是两者。如何将交互应用于它们?

  3. 更新 我通过添加minTopBottomOffset并修改ChartViewBase来使用它来解决第一个问题

    有关我的期望的更多信息:

    • 我有这样的数据:[{time: Jan 01, value: 10}, {time: Jan 02, value: 13}, {time: Jan 03, value: 5}]
    • time是X,value是Y
    • 我想在底部绘制第一行XAxis,第二行显示XAxis,第二行XAxis向右移动1天。 2行有相同的数据

    在此处查看我的预期图表:https://drive.google.com/file/d/0B5DT3STrB2t3UW0wTXpKU1RHSTA/view

    谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我认为你的图表和我一样奇怪。 :P

1,我只能使用上边距和下边距的什么东西?

您无需将minTopBottomOffset添加到BarLineChartViewBase。您应该只使用setViewPortOffsets方法。

chartView.setViewPortOffsets(left: left, top: top, right: right, bottom: bottom)

2,所有互动(拖动,缩放,触摸等)仅影响其中一个,而不是两者。如何将交互应用于它们?

我们可以用一点点的方式来做 - 添加一个块视图来接收所有手势,并将它们传递给每个图表。

首先,在BarLineChartViewBase中,添加如下方法(代码未完成。它现在仅适用于TapGestureRecognizer和PanGestureRecognizer。)。

//Modify
@objc open func receiveGestureRecognized(_ recognizer: NSUIGestureRecognizer)
{
    if recognizer is NSUITapGestureRecognizer
    {
        self.tapGestureRecognized(recognizer as! NSUITapGestureRecognizer)
    }
    else if recognizer is NSUIPanGestureRecognizer
    {
        self.panGestureRecognized(recognizer as! NSUIPanGestureRecognizer)
    }
}

其次,您应该在两个图表前添加一个块视图并覆盖它们。

然后添加一些这样的代码(PanGestureRecognizer的例子):

 UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[self.blockView addGestureRecognizer:panGestureRecognizer];

handleGesture:

- (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
[self.chartView1 receiveGestureRecognized:gestureRecognizer];
[self.chartView2 receiveGestureRecognized:gestureRecognizer];
}

所以最后你可以同时拖动它们。