2009-06-21 70 views

回答

3

您可能想要调查Core Plot项目[code.google.com]。核心剧情是WWDC今年的科学编码项目的主题,对于某些情况已经非常适用。从一开始,Core Plot就是为OS X和iPhone的使用而设计的。源代码发行版(目前还没有二进制发行版)附带OS X和iPhone示例应用程序,并且项目wiki上有关于将其用作iPhone应用程序库的信息。这是一个当前绘图功能的例子。

alt text http://core-plot.googlecode.com/files/DarkGraph.png

0

写你自己的。这并不容易,我现在正在做同样的事情。以下是我的做法:

首先,忽略任何你可能必须尝试使用​​UIScrollView的愿望,如果你想允许缩放。这完全不值得。

其次,创建一个像GraphElement协议。我有一个看起来像这样一个层次结构:

  • GraphElement
  • GraphPathElement
  • GraphDataElement
  • GraphDataSupplierElement

GraphElement包含的图形元素,包括如何得出的基本必要的方法,最大宽度(用于放大),点是否在该元素内(用于触摸)以及标准的touchBegan,touchMoved, d touchEnded功能。

GraphPathElement包含CGPath,线条颜色和宽度,填充颜色和绘图模式。无论何时提示绘制,它只是将路径添加到上下文,设置颜色和线宽,并使用给定绘图模式绘制路径。

GraphDataElement,作为GraphPathElement的子类,在x-y坐标,图形类型(条或线),框架和边界中引入一组数据。该框架是创建的输出CGPath的实际大小。边界是输入坐标中数据的大小。实质上,它可以让您将数据缩放到屏幕大小。

它通过首先计算仿射变换以将边界转换为帧来创建图形,然后循环遍历每个点并将其作为数据添加到路径,然后在添加该点之前将该变换应用于点。它如何添加数据取决于类型。

如果是条形图,它将创建一个宽度为0的矩形,原点位于(x,frame.size.height-y)和height = y。然后它将图形“插入”水平-3像素,并将其添加到路径中。

如果这是一个线图,那就更简单了。它只是移动到第一个点,然后对于每个其他点,它会在该点上添加一条线,在该点附近的矩形中添加一个圆,然后移回到该点以继续到下一个点。

GraphDataSupplierElement是我的数据库实际上包含所有数据的接口。它确定它应该是什么样的图形,将数据格式化为GraphDataElement所需的类型,并将其传递给该特定图形所用的颜色。

对我来说,x轴是时间,并表示为NSTimeInterval s。 GraphDataSupplierElement包含minDatemaxDate,因此GraphDateElement可根据需要绘制x轴标签。

完成这一切后,您需要创建实际图形。你可以通过几种方法去解决。一种选择是将所有元素保存在NSArray中,并且每调用一次drawRect:,循环遍历每个元素并绘制它。另一个选项是为每个元素创建一个CALayer,并使用GraphPathElement作为CALayer的委托。或者你可以直接从CALayer延伸GraphPathElement。这个由你决定。我还没有尝试CALayer s,但我仍然坚持在简单的NSArray阶段。一旦我对所有事物的外观都感到满意,我可能会转向CALayer

所以,一切的一切,这个想法是,你创建的图形为一个或多个CGPath小号事前,只是画,当你需要绘制图形,而不是试图去真正分析数据时,你得到一个drawRect:呼叫。

可以通过将源数据保留在GraphDataElement中来完成缩放,并且只需更改框架,以使框架边界的缩放比屏幕更宽,或者无论您的需要是什么,都可以创建更宽的屏幕。我基本上重新实现了我自己的缩放缩放,用于我的Graph UIView子类,该子类只能水平缩放,通过更改其变换,然后完成,获取当前帧,将变换重置为标识,将帧设置为保存的值,并设置所有GraphElement的框架,以及新框架,以使它们成比例。然后只需拨打[self setNeedsDisplay]即可绘制。

无论如何,这有点漫无边际,但它是我如何做到这一点的纲要。如果您有更具体的问题,请随时发表评论。

+0

您最终设法解决这个问题吗?你会碰巧写了一个完整的教程吗? – Unheilig 2014-01-12 04:44:12