有关为图表创建自定义视图布局的提示

pie*_*red 2 iphone cocoa-touch core-graphics

我需要创建一个算法来布局一些分层数据,但之前从未做过这种事情,需要一些广泛的提示.

基本上我需要重新创建此图表(使用动态数据):

图http://dl.dropbox.com/u/15126868/diagram.png
更大

我对它的大部分都没有问题,但需要帮助两件事:

  1. 如何编写布局算法?
  2. 我应该为所有光盘使用UIView子类还是使用石英(我需要交互)

任何建议最受欢迎.我不需要太多细节.


更详细一点:

我目前正在考虑我应该使用UIView子类和layoutSubviews.麻烦的是我需要知道所有节点的大小(至少大致)才能开始定位它们.然后,由于定位涉及旋转,我可能需要再次调整儿童定位 - 我不能在任何旋转之后添加标签.

其他考虑似乎是:表示区域是矩形,而不是正方形; 我无法从页面上溢出; 并且我需要动画更改光盘的大小.

任何指针都会很棒,谢谢.

Fat*_*tie 5

这种事情非常困难.

有趣的是,这里可能的主要实际初始约束是排版的大小.

在给出的例子中:观察他们可以选择一个不同的SCPT**稍微大一点(可能大10%-15%)或稍微小一点,它仍然可以工作.他们对SCPT做出了审美决定.

白色空间对设计至关重要.他们特别的平面设计师碰巧喜欢你所看到的白色空间的特殊感觉.但是对于较小的SCTP来说,这绝不是"错误的".此外,观察他们本可以使用更大的SCPT ......如果......他们在排版上使用了较小的磅值.

请注意,在任何情况下,您都无法在iPad(或Fone4)上显示那么小的类型.

所以,您必须立即决定类型的显示方式,弹出窗口,音频或其他类型.即使是白色类型("在光盘上"类型)也会给你带来麻烦.

在进行算法之前,您必须首先使用photoshop对iPad进行大量测试.纯粹是为了它的价值......

这就是我个人会做这种事情的方式.总体规划:我会尝试做一个软化算法重试自己,直到找到满意的结果.

恕我直言,基于以前做过这种事情:这个问题太难以一次性使用一些特别聪明的屁股启发式完成.由于没有一个智能助理启发式可以挽救这一天,我会这样做:

1)计算要显示的总万亿分之一.(看起来大约2.5是示例图像中的总数)

2)猜测一个SCPT值.那么例如"18"基于我们在上面看到的屏幕尺寸中的实际图像发布在您的问题中.

3)把大的(太阳)放在死点,对于中间的那些(行星) - 只需选择一个非常简单的启发式,从左上角逆时针走向最大到最小(不要尝试比问题的那部分更聪明 - 这确实可能是一个纯粹的研究项目,纯粹是它自己的......)并且对小的(卫星)做同样的事情.

4)对于行星和卫星之间的棍棒 - 采用一个简单的解决方案(如"总是0.5厘米"!!)就是这样.与AI你必须减少你的损失..无处不在!:) 修复卫星到行星并忘记它们.

5)现在是一个很难的部分..对它们运行某种启发式方法,均衡你到目前为止所拥有的东西. 将颜色视为质量,没有颜色,没有质量,移动"太阳"直到它是平衡的.(很明显,如果你遵循3中提到的"行星"布局,那么可能会向下移动.)也许还会将所有行星/月球系统移出来试图平衡它.

6)接下来的迭代.看看那个结果并决定你是否喜欢它!回到(2)并选择一个新值.(也许是"16!")

(7)这里有两种可能的结果. 可能是在开发过程中,SCPT总有一个神奇的价值. 也许是"14.3"或"18.2"或其他什么. 如果你发现这样的价值,就不要告诉任何人.把它作为你自己的秘密信息!!!! 为客户提供一切所需的一切.相反而且更困难的是,您可能会发现每次都需要不同的值.在这种情况下:你的AI必须自己迭代值,直到找到它喜欢的值.(例如,通过确定您的所有标签是否适合......以及明显的事情,例如"他们是否触摸""全屏幕"等.)

无论如何FWIW(可能没什么)就是我要做的 - 基于对SCPT的第一次猜测的迭代方法.

顺便说一下:你可能想要购买和学习这类信息的经典而精彩的书!每个人都应该有一份副本.

Tufte's Quantatative Information的视觉显示
由Edward R. Tufte
ISBN 0961392142

关于布局图像的机制.你应该使用石英或任何其他低级绘图 - 忘记UIViews等.你应该完全将逻辑与绘图层完全分开,所以(即使你确实想要改为UIViews,OpenGLES等),它只会改变几行代码.

希望它能以某种方式帮助.

注释......
**SCPT ..万亿平方厘米

跟进......
"为了保持逻辑分离你会使用经理型模式吗?"
说实话:如果我这样做,我会开始一个全新的应用程序纯粹是为了"研究"获得这个部分,这个挑战,正常工作.在那个应用程序中(说实话!)我会让bugger尽一切努力以任何整齐的方式做任何事情!: - // Globals无处不在!:)不幸的是,我一次只能想到一件事,所以在那个阶段我只会考虑算法本身.

我相信,一旦你解决了这个问题,一旦你开始在一个更大的项目中实现它......真的,FWIW,如果是我,我只是让它成为一个类(让我们说AmazingClass)没有什么比复杂的那.就个人而言,我会将数据分别设置在某个地方(无论是在数据库中,还是只是数组或其他),我只是让AmazingClass负责获取数据.(我的想法 - 你永远都不知道你到底需要什么样的数据以及什么时候,在AmazingClass的过程中的什么时候.所以,只要放弃,让AmazingClass把它当作它想要的时候.)

如果您熟悉这些令人敬畏的经理模式,您说话 - 是的,为什么不呢!简而言之,我会尽可能地将它分开.我不能谈论最好的方法 - 但只是把它完全分开.对不起,我无法帮助那个.