在NSWindowController上,设置contentViewController会更新窗口的位置,我该如何停止呢?

时间:2019-01-03 18:58:13

标签: swift macos cocoa nswindow nswindowcontroller

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

  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:]

当我手动拖动窗口时,所有这三种方法都会引起窗口移动。

但是,当通过编程方式从^^

以上的那一行代码更改框架时,三个窗口中没有一个捕获到窗口移动

有人以前看过这个吗,或者有一个可能的想法吗?

1 个答案:

答案 0 :(得分:1)

事实证明,要把这个问题隔离到一个测试项目中需要付出很大的努力,所以我决定只放一个补丁,

我只是在设置contentViewController之前存储了原点,然后将其重置。这对我有用,尽管我仍然不确定为什么会发生这种情况

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