需要在iOS中制作像甘油一样的甘特图,绘制还是子视图?

时间:2014-02-25 00:07:02

标签: ios uiview ios7 core-graphics

我准备开始在iOS中为我的应用创建一个甘特图,就像控件一样。我需要显示事件的时间表。基本上是一堆矩形,一些线条/弧线用于某些装饰,可能是一个或两个触摸点来编辑属性。它基本上是我手机上的“全屏”控制。

我看到了实现这个自定义UIView子类的两个基本路径:

  1. 只需实施drawRect:并使用CoreGraphics来电前往城镇。很可能分裂了一堆私有方法来完成所有绘图工作。可能会根据需要缓存一些信息,以帮助检测任何子区域。

  2. 不是“绘制”图形,而是使用addSubview:添加一堆UIViews作为子项并操纵它们的layer属性以使它们显示不同的图形片段,并{{1适当地定位它们。然后让“绘画”照顾好自己。

  3. 一条路比另一条好吗?从长远来看,我可能最终都试图看到,但我想我会先找到那些先走过的人的智慧。

    我的猜测更快的解决方案将是bounds\frame路由,而子视图方法需要更多代码,但可能更强大(更容易命中检测,动画支持,自动剪辑管理等)。我确实希望能够长期实施捏缩放等。

    更新

    我采用了drawRect:方法。这让我选择和滚动免费(经过一些惊喜)。到目前为止,我对结果非常满意。

3 个答案:

答案 0 :(得分:1)

在性能方面,优先选择写得很好的drawRect:,尤其是当您可能需要渲染许多rects时。通过视图,整个布局系统开始工作,如果你有自动布局,整个布局系统进入城镇并杀死你的表现会更糟糕。出于性能原因,我最近将日历视图从基于视图升级到基于CG。

在所有其他方面,当然更喜欢使用视图。界面生成器,简单的手势识别器设置,OO等。您仍然可以为每个元素创建逻辑类,并让它在当前上下文中绘制(最好传递上下文引用并绘制它),但仍然不是那么直截了当。

在较新的设备上,实际上查看绘图性能非常高。但是如果你想要这些iPhone 4和4S设备,如果你想要这些缺乏GPU性能的iPad 3设备,我会说,根据你的图表的潜在尺寸,你可能不得不采用CG方式。

现在,你提到捏缩放。无论怎样,这都是婊子。如果你写好drawRect:,那么你最终可以按照平铺的方式工作。

答案 1 :(得分:1)

如果您计划让用户移动图表的某些部分,我肯定会建议使用这些视图。

仅供参考,你可以使用drawRect来处理缩放。

在这种情况下,推动我使用UIView的原因是支持拖动图表的各个部分,动画图表中的过渡,以及点击图表中的元素(尽管使用drawRect :)这不会太难。此外,如果您的图表中的元素需要大量的CPU使用来渲染,如果您需要使用UIView重绘图表的子部分,因为元素的渲染被缓存到图层,您只需要重新绘制你关心的部分而不是整个图表。

如果您的图表非常大并且您想要使用drawRect:您可能希望使用CATileLayer进行备份,以便在内存中没有整个图层。如果您只想渲染请求的图块而不是整个区域,这可能会增加额外的挑战。

答案 2 :(得分:1)

与CoreGraphics一起使用会比使用UIViews构建更多的代码行,尽管它在内存上性能更高,性能更好。但是,您可能需要一个更强大的解决方案来管理所有内容。 UICollectionView似乎是将数据映射到具有自定义UICollectionViewCell子类的视图的适当解决方案。这比开发自己的开发要快得多,并且通过UICollectionViewLayout子类具有很大的灵活性。开箱即用不支持缩放,但有ways to do it。由于单元重用,这对于内存比使用一堆UIViews更好,但是重新加载可能会变慢,只有几百个项目都有不同的大小需要计算。