【问题标题】:NSView: drag subview from superview to another NSViewNSView:将子视图从父视图拖到另一个 NSView
【发布时间】:2011-10-25 16:40:34
【问题描述】:

我有一个为杂志布置页面的应用程序。该应用程序在名为 MasterPage 的 NSView(它本身是 NSScrollView 的 contentView)上布置杂志的页面(称为 Page 的类的 NSView)。想想滚动视图中的页面网格。

然后,“页面”上会自动放置代表广告的子视图(class= 广告)。我希望能够在它们的超级视图(Page 类的 NSView)和 MasterPage 的子视图(其他 Page 类视图)之间拖动这些广告。

我可以通过调用 mouseDragged 方法将 Ad 类 NSView 拖动到最初放置在其上的 Page 类 NSView 上,但是如何从超级视图“释放”Ad 类子视图并将其拖动到另一个 NSView?

希望这是有道理的。

【问题讨论】:

    标签: cocoa drag nsview subview superview


    【解决方案1】:

    当您开始拖动事件时,将拖动视图从其父视图中移除,并将其添加到NSWindowcontentView。然后,您可以在整个窗口中拖动它。当拖动事件完成时,使用hitTest: 来确定您在哪个视图之上(您可能必须返回超级视图层次结构才能找到您真正想要的视图)。然后将拖动视图添加回最终目标。

    根据您在视图中实现剪辑的方式,您可以跳过将拖动视图移动到contentView 的步骤。如果您不剪辑页面视图,那么拖动视图可以在整个屏幕上移动。

    【讨论】:

    • 谢谢 Rob,我正朝着那个方向前进。我可以将它从 superview 中取出并放入 contentView 但拖动变为禁用
    • 我不确定这是否可行(但我从未尝试过)。我怀疑这是因为从视图层次结构中删除的视图搞砸了拖动机器。在这种情况下,我建议将视图留在原处,但在“拖动”时将其自身重绘为空白,并且仅在成功放置后完成视图移动。
    • 您可能需要手动跟踪 mouseDown、mouseMoved 和 mouseUp。自从我这样做以来已经有一段时间了。就 Joshua 而言,您可能希望将视图渲染为位图、隐藏视图并拖动位图。这对性能和应用效果都有好处(这是拖放的一般实现方式)。
    • 隐藏可能更容易。 :-) 除非你有其他东西显示/隐藏视图,否则它可能会变得很棘手。否则,只需在拖动时绘制一个空白视图。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多