【问题标题】:Drawing lines between windows just like in Interface Builder就像在 Interface Builder 中一样在窗口之间绘制线条
【发布时间】:2010-06-13 10:57:15
【问题描述】:

我有两个窗口,每个窗口都有一个圆形NSView

------------------     ------------
|X-+ Oscillator  |     |X-+ Mixer |
|----------------|     |----------|
|                |     |          |
|        O       |     |     O    |
|                |     |          |
|                |     |          |
------------------     ------------

两个窗口位于单独的 NIB 中。我希望能够在运行时使用拖放操作在两轮NSViews 之间画一条线,就像在 Interface Builder 中连接 IBOutlets 一样:

------------------     ------------
|X-+ Oscillator  |     |X-+ Mixer |
|----------------|     |----------|
|                |     |          |
|        O-------+-----+-----O    |
|                |     |          |
|                |     |          |
------------------     ------------

我还希望能够使用画线确定NSViews 与哪个NSViews 相连。我需要这个来将振荡器连接到混音器。我还希望能够通过拖入空白空间来删除​​连接。

谁能解释我如何做到这一点?谢谢。

【问题讨论】:

    标签: objective-c cocoa drag-and-drop drawing line


    【解决方案1】:

    问题在于您可以在其中绘制跨越两个窗口的组合矩形(或它们所在的一个或多个屏幕)的视图。这通常通过无边界、透明的“覆盖窗口”来完成。网上有很多无边框透明窗口的示例。

    在拖动开始时,覆盖窗口出现(但对用户不可见)位于您的绘图区域上方。随着拖动的更新,您绘制线条,将覆盖视图坐标转换为源/目标视图坐标/从源/目标视图坐标转换。拖动完成后,做一些动画(如淡入淡出或闪烁),然后整理覆盖窗口。

    【讨论】:

    • 没有代码?这没什么帮助。为什么是绿色复选标记?
    • 绿色复选标记是因为我为 OP 发布的问题提供了一种可能的方法,但实施细节可能会有很大差异,因为我没有任何现成的解决方案,我没有'不要为他们做别人的功课。我回答了有关方法的问题;如果 OP(或其他任何人)卡住了,让他们按照 SO 上的预期提出一个具体问题(描述他们尝试过什么以及出了什么问题)。
    • 我明白了。考虑到这个问题,我会期待一个例子。
    • 很抱歉,免费的巧克力蛋糕没有附赠一杯免费的牛奶。 OP 似乎对四年多前已将其标记为已接受的答案感到足够满意,但我想对每个人来说都是他自己的。
    【解决方案2】:

    我认为您的方法最大的问题是您有两个单独的窗口,一个带有振荡器视图,一个带有混音器。如果您可以更改您的设计,以便在单个窗口中显示所有合成器组件(或者可能是射频组件 - 不确定您在做什么!),那么您的问题会变得简单得多。

    正如 Joshua 所说,一种方法是使用仅显示链接的不可见覆盖窗口。但是,如果您真的使用两个单独的窗口,那么您不能(正如 Joshua 建议的那样)在拖动结束时订购覆盖窗口。如果这样做,链接将在拖动结束时消失。如果您希望链接继续显示(想想 Interface Builder 或 - 更好的是 - Quartz Composer),那么您需要一些机制来持续显示链接。如果您希望稍后允许用户删除链接,则尤其如此。

    我强烈建议您围绕单个窗口构建界面。另外,考虑使用 Core Animation 将每个链接显示为一个层。

    戴夫

    【讨论】:

    • 如果要保持连接,那么覆盖窗口就会保持不变……适应起来并不难。始终存在的叠加层的唯一真正挑战是允许点击失败。
    • 是的,可以使覆盖窗口方法持续工作。但是正如您所说,这会引入点击问题,那么在您有多个实体之间存在多个连接的一般情况下,您会怎么做?您必须为每个链接使用一个覆盖窗口(呃),或者将新链接添加到可能需要调整大小以跨越所有链接实体的现有覆盖窗口。我对此思考得越多,我就越认为更清洁的解决方案是在一个窗口中完成所有操作。这正是 CALayer 完美解决的问题。
    • 在持久窗口的情况下,可以保持屏幕(或所有屏幕)的大小。点击问题真的不是什么大问题,并且已经有代码示例在四处飘荡。至于复杂性,肯定是困难的,但不是那么困难,以至于多窗口方法应该因此而被丢弃。如果 OPs 要求是多个窗口,并且可以有一个解决方案,那么最好解决最初的要求。
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多