【问题标题】:How do I do something after the next NSView -layout has occurred?在下一个 NSView -layout 发生后我该怎么做?
【发布时间】:2014-02-06 16:12:12
【问题描述】:

为了响应用户事件,我想:

  • 在窗口中添加一个新的 NSView,然后
  • 显示位于该视图正下方的 NSPanel

我已经完成了每一半。我可以添加一个新的子视图,容器视图的-updateConstraints 会识别它并添加正确的布局约束,以便下次执行布局时,它会正确定位在窗口中。另外,我有一个 NSWindowController 子类,可以将面板放在屏幕上。

很遗憾,出现了订购问题。我的面板的控制器只是查看新 NSView 的 frame 属性来决定将它放在哪里,但是在主事件循环的这次迭代中,-layout 方法还没有被调用,所以它仍然定位在 (0, 0).

(如果我将这两个功能分开,并且需要两个单独的用户事件来“添加视图”和“创建面板”,那么面板将正确定位在视图下方。)

有没有办法将 NSPanel 附加到 NSView 上,就像使用布局约束一样?或者有没有办法说“这样做(窗口控制器的东西),但只能在下一次-layout 调用之后”?

【问题讨论】:

    标签: macos cocoa nsview nswindowcontroller nspanel


    【解决方案1】:

    只要在你的 NSView 的父视图上调用 -layoutSubtreeIfNeeded,只要你添加它和它的约束,它就会立即布局,然后添加面板。

    或者使用 NSPopOver,尽管它们以某种方式绘制,而您可能不希望那样。

    【讨论】:

    • 是的,我一定一直在考虑 NSPopOver 的 – showRelativeToRect:ofView:preferredEdge: 方法。我过去使用过 NSPopOver,但在这种特殊情况下我不想要语音气泡三角形。
    猜你喜欢
    • 2011-02-14
    • 2018-01-16
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2012-05-26
    相关资源
    最近更新 更多