我想在iphone中显示图形/条形图,如何在没有自定义API的情况下执行此操作; s
答案 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包含图元素的基本必要方法,包括如何绘制,最大宽度(用于放大),点是否在该元素内(用于触摸)和标准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
包含GraphDataSupplierElement
和minDate
,以便maxDate
可以根据需要绘制x轴标签。
完成所有这些后,您需要创建实际图表。你可以通过几种方式去做。一种选择是将所有元素保留在GraphDateElement
中,并且每当调用NSArray
时,循环遍历每个元素并绘制它。另一种选择是为每个元素创建drawRect:
,并使用CALayer
作为GraphPathElement
的委托。或者您可以CALayer
直接从GraphPathElement
延伸。这取决于你。我还没有尝试CALayer
,我仍然陷入简单的CALayer
阶段。一旦我对一切看起来都很满意,我可能会在某个时候转移到NSArray
。
所以,总而言之,我们的想法是你事先将图形创建为一个或多个CALayer
,并在需要绘制图形时绘制,而不是在你需要时实际解析数据得到CGPath
电话。
缩放可以通过将源数据保留在drawRect:
中来完成,只需更改框架,以便缩放框架边界可以创建比屏幕更宽的GraphDataElement
,或者任何需求是。我基本上为我的Graph CGPath
子类重新实现了我自己的pinch-zoom,它只能水平缩放,通过改变它的变换,然后在完成时,获取当前帧,将变换重置为identity,将帧设置为已保存值,并将所有UIView
的帧设置为新帧,以使它们缩放。然后只需致电GraphElement
即可。
无论如何,这有点絮絮叨叨,但它是我如何实现它的概述。如果您有更具体的问题,请随时发表评论。