想象一下,我将窗口的位置保存在我的首选项文件中。现在,用户将窗口移动到第二个监视器,然后退出我的应用程序。然后他断开第二台显示器并再次启动我的应用程序。 现在我的应用程序想要恢复窗口的保存位置。但如果它盲目恢复旧的窗口坐标,窗口就会出现在屏幕外。
我曾经在我的Carbon应用程序中使用ConstrainWindowToScreen,但是现在我将它移植到Cocoa,我找不到相应的。
文档表明,不知何故,Cocoa会自动阻止这种情况发生。虽然在窗口打开时监视器发生变化时可能就是这种情况,但在我自己存储窗口位置并在启动时重新打开窗口时恢复它们的情况下,这是行不通的。我需要根据需要调用Cocoa的魔术功能,但是如何?
(注意:我知道我可以迭代所有可用的屏幕,但如果我想让这个万无一失,那写自己真是太痛苦了。但是,如果你能提供一个完整的C或ObjC功能来解决它方式,也值得赞赏。)
答案 0 :(得分:1)
请参阅NSWindow Class Reference中的“管理用户默认值中的窗口框架”部分。这些方法确保窗口完全放在屏幕上。
如果您想自己保存和恢复窗口位置(作为字符串),请使用-stringWithSavedFrame
和-setFrameFromString:
。
使用-saveFrameUsingName:
和-setFrameUsingName
让NSWindow在给定窗口名称的情况下保存并恢复用户默认值中的帧。
答案 1 :(得分:1)
我同意Darren建议使用内置机制来恢复窗口位置。实际上,它就像在IB中设置窗口的框架自动保存名称一样简单(或使用-setFrameAutosaveName:
)。
也就是说,如果一个窗口有一个标题栏,那么将它排序到屏幕上的所有方法(例如-orderFront:
或-makeKeyAndOrderFront:
)将自动重新定位它以确保至少标题酒吧和屏幕的一大块是在屏幕上。实际上很难让一个标题窗口在理论上可见,但实际上是在屏幕外。