如何在iphone中使用整数值生成图形

时间:2009-06-21 07:15:09

标签: objective-c iphone xcode

我想在iphone中显示图形/条形图,如何在没有自定义API的情况下执行此操作; s

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

其次,创建类似GraphElement协议的东西。我的层次结构看起来像这样:

  • GraphElement
  • GraphPathElement
  • GraphDataElement
  • GraphDataSupplierElement

GraphElement包含图元素的基本必要方法,包括如何绘制,最大宽度(用于放大),点是否在该元素内(用于触摸)和标准touchBegan,{{ 1}}和touchMoved函数。

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

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

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

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

如果是折线图,那就简单多了。它只是移动到第一个点,然后换到另一个点,它向该点添加一条线,在该点周围的矩形中添加一个圆,然后移回到该点继续下一个点。

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

对我来说,x轴是时间,并表示为GraphDataElement s。 NSTimeInterval包含GraphDataSupplierElementminDate,以便maxDate可以根据需要绘制x轴标签。

完成所有这些后,您需要创建实际图表。你可以通过几种方式去做。一种选择是将所有元素保留在GraphDateElement中,并且每当调用NSArray时,循环遍历每个元素并绘制它。另一种选择是为每个元素创建drawRect:,并使用CALayer作为GraphPathElement的委托。或者您可以CALayer直接从GraphPathElement延伸。这取决于你。我还没有尝试CALayer,我仍然陷入简单的CALayer阶段。一旦我对一切看起来都很满意,我可能会在某个时候转移到NSArray

所以,总而言之,我们的想法是你事先将图形创建为一个或多个CALayer,并在需要绘制图形时绘制,而不是在你需要时实际解析数据得到CGPath电话。

缩放可以通过将源数据保留在drawRect:中来完成,只需更改框架,以便缩放框架边界可以创建比屏幕更宽的GraphDataElement,或者任何需求是。我基本上为我的Graph CGPath子类重新实现了我自己的pinch-zoom,它只能水平缩放,通过改变它的变换,然后在完成时,获取当前帧,将变换重置为identity,将帧设置为已保存值,并将所有UIView的帧设置为新帧,以使它们缩放。然后只需致电GraphElement即可。

无论如何,这有点絮絮叨叨,但它是我如何实现它的概述。如果您有更具体的问题,请随时发表评论。