【问题标题】:Tips on creating a custom view layout for a diagram为图表创建自定义视图布局的提示
【发布时间】:2010-12-13 17:29:38
【问题描述】:

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

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

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

我大部分都没有问题,但在两件事上需要帮助:

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

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


更多细节:

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

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

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

【问题讨论】:

    标签: iphone cocoa-touch core-graphics


    【解决方案1】:

    这种事情很难。

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

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

    空白对设计至关重要。他们特别的平面设计师碰巧喜欢你看到的白色空间的特殊感觉。但对于较小的 SCTP,它绝不会是“错误的”。此外,请注意他们本可以使用更大的 SCPT ... IF ... 他们在排版上使用更小的磅值。

    请注意,在任何情况下,您都无法在 iPad(或 Fone4)上显示这么小的字体

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

    在继续使用算法之前,您必须先在 iPad 上使用 Photoshop 进行大量测试。所以纯粹是为了它的价值......

    这就是我个人会做这种事情的方式。总体计划:我会尝试做一个软弱的算法,它会自行重试,直到找到满意的结果。

    恕我直言,基于之前做过的这类事情:这个问题太难用一些特别聪明的启发式方法一次性解决了。由于没有一种聪明的启发式方法可以挽救这一天,我会这样做:

    1) 计算要显示的总万亿。 (看起来示例图像中的总数约为 2.5)

    2) 猜测一个 SCPT 值开始。例如“18”基于我们在上面看到的屏幕尺寸的实际图像,如您的问题中发布的那样。

    3)把大的(太阳)放在死点,中间的(行星)——只要选择一个非常简单的启发式,从左上角逆时针从大到小怎么样(不要'不要试图在问题的那一部分上变得比这更聪明——这确实可能是一个纯粹靠它自己的巨大研究项目).. 对小的(卫星)做同样的事情。

    4) 对于行星和卫星之间的棍子 - 采用一个简单的解决方案(比如“总是 0.5 厘米”!!)就是这样。有了人工智能,你必须减少损失......无处不在! :) 将卫星固定在行星上,然后忘记它们

    5) 现在是困难的部分.. 对它们运行某种启发式方法均匀地平衡你到目前为止所拥有的东西。 将颜色视为质量,无色视为无质量,并移动“太阳”,直到它达到平衡。 (要清楚,作为一个例子,如果你遵循 3 中提到的“行星”布局,可能会向下移动。)也可以将所有行星/月球系统移入移出以尝试平衡它。

    6) 接下来的迭代。看看这个结果,然后决定你是否喜欢它!返回 (2) 并选择一个新值。(例如“16!”)

    (7) 这里有两种可能的结果。 可能是在开发过程中,SCPT 有一个神奇的值始终有效。可能是“14.3”或“18.2”或其他。 如果你发现了这样的价值,千万不要告诉任何人。将其作为您自己的秘密信息!!!! 为客户提供价值。相反,更困难的是,您可能会发现每次都需要不同的值。在这种情况下:您的 AI 将不得不自己遍历值,直到 找到它喜欢的值。 (例如,通过确定您的所有标签是否适合......以及诸如“它们是否在触摸”“所有在屏幕上”等明显的东西。)

    无论如何,FWIW(也许什么都不会)这就是我会做的 - 基于对 SCPT 的第一次猜测的迭代方法。

    顺便说一句:您可能很想购买和研究关于这种信息显示的经典而精彩的书!每个人都应该有一份副本。

    Tufte 的 量化信息的可视化展示
    爱德华·R·塔夫特
    国际标准书号 0961392142

    关于布局图像的机制。您应该使用石英或任何其他低级绘图 - 忘记 UIView 等。您当然应该将逻辑与绘图层完全分离,因此(即使您确实想更改为 UIViews、OpenGLES 或其他)只需更改几行代码。

    希望能有所帮助。

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

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

    我相信,一旦你解决了问题本身,一旦你开始在一个更大的项目中实施它......真的,FWIW,如果是我,我只会让它成为一个类(比如说 AmazingClass)什么都没有比这更复杂。就我个人而言,我会将数据单独设置在某个地方(无论是在数据库中还是在数组中或其他任何地方),我什至会让 AmazingClass 负责获取数据。 (我的想法 - 你永远不知道你将如何需要数据,以及在 AmazingClass 过程中的什么时间点。所以,放弃吧,让 AmazingClass 在它需要的时候接受它。)

    如果您熟悉您所说的这些听起来很棒的经理模式 - 是的,为什么不呢!简而言之,我会尽可能地把它分开。我还不够好,无法谈论做到这一点的最佳方式——但只是将它完全分开在某个地方。抱歉,我帮不上那个忙。

    【讨论】:

    • 乔,多么棒的答案,谢谢。这都是非常有用的信息。我在想一些类似于 SCPT 的东西,我真的很高兴你认为我需要一种迭代方法 - 我开始认为我是一个傻瓜,因为我无法弄清楚一种一次性处理布局的方法。
    • 为了保持逻辑分离,你会使用管理器类型的模式吗?正如我所怀疑的那样,这将是一个艰难的过程,但你让我朝着一个好的方向前进。非常感谢您抽出宝贵时间提供帮助。
    • 同意。以研究为名的最初混乱似乎是最好的。我没有经常玩 CA 和 CG,所以我想我会从那里开始,然后看看我是否可以在没有文本的情况下获得一些模糊的工作。再次感谢乔 - 我现在感觉很好!
    • 动画这个过程是个绝妙的主意。无论如何,我都希望对布局的更改进行动画处理。不过对我来说没有 perl - 我从来没有学过它,所以我最好坚持使用 C。如果你有兴趣了解它的进展情况,我已经将我的 twitter id 添加到我的个人资料中。再次,非常感谢。
    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多