【问题标题】:iOS-Charts draw 2 chart views with same YAxisiOS-Charts 绘制 2 个具有相同 YAxis 的图表视图
【发布时间】:2017-01-08 12:48:28
【问题描述】:

我正在 iOS 上实现一个折线图,能够使用 iOS Charts 和 Swift 比较数据

最简单的场景

比较 1 月 4 日到 1 月 05 日、1 月 5 日到 1 月 6 日、1 月 6 日到 1 月 7 日等等的数据……

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

我做到了

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

问题

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

  2. 所有交互(拖动、缩放、触摸等)只影响其中之一,而不影响两者。如何使交互同时应用于它们?

更新 我通过添加 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

谢谢!

【问题讨论】:

  • 你能展示一下你是如何设置它的代码吗?
  • @AdityaGarg 我只在同一个 UIView 中创建了 2 个 LineChartView 并绘制它们。 1 带有顶部 XAxis 和图例;和 1 底部 XAxis 和图例。无特殊配置
  • 我不认为我很关注。如果您比较 2 天,它们的 x 和 y 轴不会相同吗?只有这样比较才有意义。您能否详细说明“日移”的含义
  • @AdityaGarg 感谢您的回复。我有相同的 YAxis 但没有 XAxis。我的例子: - 我有这样的数据:[{time: Jan 01, value: 10}, {time: Jan 02, value: 13}, {time: Jan 03, value: 5}] - time 是 X,value 是 Y - 我想绘制第一行,XAxis 在底部,第二行 XAxis 显示在顶部,第二行 XAxis右移 1 天。 2 行有 相同的数据 在此处查看我的预期图表:drive.google.com/file/d/0B5DT3STrB2t3UW0wTXpKU1RHSTA/…

标签: ios swift charts ios-charts


【解决方案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];
}

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

【讨论】:

  • 谢谢你,Y.Bi。有时间我会试试你的解决方案(目前,我的客户接受了与第二张图表交互的限制)
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多