我需要创建一种算法来布局一些分层数据,但以前从未做过这种事情,并且需要一些广泛的技巧。

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

diagram http://dl.dropbox.com/u/15126868/diagram.png
bigger

我大部分都没有问题,但是需要两点帮助:


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


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



更详细一点:

我目前在想应该使用UIView子类和layoutSubviews。麻烦的是,在开始放置它们之前,我需要知道所有节点的大小(至少是大致大小)。然后,由于定位涉及旋转,因此我可能需要再次调整子位置-并且直到进行任何旋转后才能添加标签。

其他考虑因素似乎是:显示区域是矩形,而不是正方形;我不能从页面上溢出;并且我需要为光盘的大小制作动画。

任何指针都很好,谢谢。

最佳答案

这种事情非常困难。

有趣的是,这里可能主要的实际初始约束是字体的大小。

在给出的示例中:观察到他们可以选择一个稍大一些的SCPT **(也许大10%-15%)或更小一个它仍然可以工作。他们对SCPT做出了美学决定。

空白对于设计至关重要。他们特别的平面设计师碰巧喜欢您所看到的空白感。但是,使用较小的SCTP绝不是“错”的。此外,观察他们可能使用了更大的SCPT ... IF ...他们在版式上使用了较小的磅值。

请注意,无论如何,您根本无法在iPad(或Fone4)上显示这么小的文字。

因此,您必须立即决定类型的显示方式,弹出窗口,音频或其他内容。即使是白色(“光盘上”类型)也会给您带来麻烦。

您必须先在iPad上使用photoshop进行大量测试,然后才能进行算法。所以纯粹是为了它的价值...

这是我个人将执行此类操作的方式。总的来说,我会尝试做一个松散的算法,然后重试直到找到满意的结果。

恕我直言,基于以前做这种事情的基础:这个问题很难通过一些特别聪明的启发式方法一劳永逸地解决。由于没有一种智能资产启发法可以节省一天的时间,因此我将这样做:

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的第一次猜测的迭代方法。

顺便说一句:您可能希望通过这种信息展示来购买和研究经典而辉煌的书!!!每个人都应该有一个副本。

图夫特的定量信息的视觉展示
爱德华·塔夫特(Edward R.
书号0961392142

关于布局图像的机制。您应该使用石英或任何其他低级绘图-不用担心UIViews之类的东西。您肯定应该将逻辑与绘图层完全分开,因此(即使您确实要更改为UIViews,OpenGLES或其他任何东西)也只需更改几行代码。

希望它能有所帮助。

笔记...
** SCPT ..平方厘米/万亿

跟进...
“为了保持逻辑上的分离,您会使用经理型模式吗?”
老实说:如果我这样做的话,我只会启动一个全新的应用程序,纯粹是为了“研究”获得这一部分,这一挑战,正确工作。在那个应用程序中(说实话!),我将尽一切努力以任何整洁的方式做任何事情! :-/全球各地! :)不幸的是,我一次只能想到一件事,所以在那个阶段,我只会考虑算法本身。

我相信,一旦您解决了这个问题,就可以在一个更大的项目中实现它了……真的,FWIW,如果是我,我只会使其成为一个类(比方说AmazingClass),没有比这更复杂的了那。就我个人而言,我会将数据分别放置在某个地方(无论是在数据库中还是在数组中或其他任何东西中),而且我只会让AmazingClass负责获取数据。 (我的想法-您永远不知道自己到底会需要什么数据,以及何时需要在AmazingClass的过程中的什么时候。因此,只需放弃并让AmazingClass随需使用它。)

如果您熟悉这些听起来不错的经理模式,是的,为什么不呢!简而言之,我会尽可能地将其分开。我还不足以说出做到这一点的最佳方法-只是将其完全分开。对不起,我帮不上忙。

关于iphone - 有关为图创建自定义 View 布局的提示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4431610/

10-12 01:49