【发布时间】:2019-01-03 18:58:13
【问题描述】:
我有一个NSWindowController 和一个NSWindow,
我有一个问题,如果我设置控制器的 contentViewController,NSWindow 的框架会更新超出我的预期
- 窗口位于原点,例如 (500,500),大小为 (100,100)
- 我把它拖到(300,300)
- 我按下一个更新
contentViewController的控件 - 大小保持在 (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