【问题标题】:On NSWindowController, setting contentViewController updates the window's position, how can I stop this?在 NSWindowController 上,设置 contentViewController 会更新窗口的位置,我该如何停止呢?
【发布时间】:2019-01-03 18:58:13
【问题描述】:

我有一个NSWindowController 和一个NSWindow, 我有一个问题,如果我设置控制器的 contentViewControllerNSWindow 的框架会更新超出我的预期

  1. 窗口位于原点,例如 (500,500),大小为 (100,100)
  2. 我把它拖到(300,300)
  3. 我按下一个更新contentViewController的控件
  4. 大小保持在 (100,100),但 原点回到 (500, 500)

整个窗口的大小保持不变,但只是移回原来的位置

这是更新框架的代码

self.contentViewController = loadingViewController

我通过在 lldb 中打印出该行之前和之后的窗口框架来确认这一点:

▿ Optional<CGRect>
  ▿ some : (-1701.0, 439.0, 1042.0, 778.0)
    ▿ origin : (-1701.0, 439.0)
      - x : -1701.0
      - y : 439.0
    ▿ size : (1042.0, 778.0)
      - width : 1042.0
      - height : 778.0

(lldb) po self.window?.frame
▿ Optional<CGRect>
  ▿ some : (-1680.0, 416.0, 800.0, 778.0)
    ▿ origin : (-1680.0, 416.0)
      - x : -1680.0
      - y : 416.0
    ▿ size : (1042.0, 778.0)
      - width : 1042.0
      - height : 778.0

更神秘的是,我最初尝试了 3 个不同的位置来捕捉窗口移动以定位导致它的代码行

我注册为观察员:

NotificationCenter.default.addObserver(self, selector: #selector(windowMoved(notification:)), name: NSWindow.didMoveNotification, object: nil)

以及在以下位置设置符号断点:

-[NSWindow _windowMoved:] 和 -[NSWindow _setFrame:]

当我手动拖动窗口时,所有这 3 种方法都会捕捉到窗口移动。

但是,当框架从上面的一行代码以编程方式更改时,这 3 个都没有捕捉到窗口移动 ^^

有没有人以前见过这个,或者知道这是怎么回事?

【问题讨论】:

  • 我们如何在测试项目中重现该问题?
  • 这点很好。我几乎没有想法,特别是因为我无法捕捉到窗口的框架更改指令,我只能看到它在视觉上的变化。我将尝试将其拉出,将其隔离到一个测试项目中,如果我能找出问题,我会报告回来。不然我就上传测试项目给你们看看

标签: swift macos cocoa nswindow nswindowcontroller


【解决方案1】:

结果证明把这个问题隔离到一个测试项目中太费劲了,所以我决定只打一个补丁,

我只是在设置contentViewController 之前存储原点,然后将其重置。这对我有用,但我仍然不确定为什么会这样

    let originalFrameOrigin = self.window?.frame.origin ?? CGPoint(x: 100, y: 100)
    self.contentViewController = loadingViewController
    self.window?.setFrameOrigin(originalFrameOrigin)

【讨论】:

  • 我遇到了这个问题并得出了相同的结论,但我现在意识到在全屏模式下更改 contentViewController 会导致 contentView 的顶部被剪裁 - 尽管设置了顶部空间以superview = 0 约束,它将 nsview 的顶部定位在 nstoolbar 之下。您是否遇到过这个问题,如果遇到过,请找到解决办法?
  • 刚刚测试过,我全屏显示并尝试通过我们的 UI 换出主视图控制器,但没有发生。 然而,我以前见过,这与自动布局约束有关。希望界面生成器可以帮助您,但我认为您需要在内容视图中添加一些空间,听起来您的子视图正在以某种方式被挤压
  • 我的错 - 这是因为我设置了框架的大小和位置(尽管为什么根据前一个 contentviewcontroller 框架的大小设置大小导致问题超出了我的范围)。最后,我只是添加了一个全屏模式检查,并且只在框架不活动时重置框架。
  • 不错。是的,这有点好笑,对于我前面提到的问题,我们只在 macOS 10.13 上看到过,该视图位于工具栏下方。在 10.14 上,这不是问题
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2011-10-02
  • 2012-04-15
  • 2012-12-27
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多