【问题标题】:NSWindow restored frame locationNSWindow 恢复帧位置
【发布时间】:2016-05-27 00:51:03
【问题描述】:

在 OS X 上,是否可以以编程方式访问缩放或最大化窗口的恢复窗口位置。

ie:在大多数 OS X 应用程序中,您可以双击标题栏来缩放它。如果再次双击它,它会恢复到之前的位置。

我希望能够获取并设置保存的位置矩形。

【问题讨论】:

  • 你试过什么?有很多方法可以做到这一点(NSUserDefaults、Applescript、从 com.apple.finder.plist 中获取,等等)。另外,您打算如何触发边界的保存,以及您想要哪个位置,放大或缩小?
  • @l'L'l 我们会查看 NSWindow 和 NSWindowController 的文档。 (NSUserDefaults、Applescript 和 plist 的东西在这种情况下没有意义)。我有一个我的应用程序创建的 NSWindow - 我想要非缩放、非最大化的位置(OS X 显然有某个地方)但找不到它的 API。
  • 标准且可能最有效的方法是使用setFrameAutosaveName:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
  • @l'L'l 除了我需要比这更细粒度的控制。 (例如:我正在尝试管理多个用户可切换的窗口布局)。此外,这种方法似乎并没有保存恢复的位置。
  • @l'L'l 对不起,也许是我在 Windows 编程方面的背景导致我跨越了术语。 “恢复位置”是指非最大化/非缩放位置。当您取消缩放/取消最大化它时 OS X 将窗口重置到的位置。当 NSWindow 最大化/缩放时,OS X 会在某处保留旧框架位置的副本 - 我如何得到它?

标签: macos nswindow nswindowcontroller


【解决方案1】:

您可以创建自定义 NSWindowDelegate 以在 NSWindow 帧最大化之前保存它:

@interface MyWindowDelegate : NSObject {
@private
  NSRect m_maximizedFrame;
  NSRect m_restoredFrame;
}

- (NSRect)windowWillUseStandardFrame:(NSWindow*)window
                        defaultFrame:(NSRect)newFrame
{
  // Save the expected frame when the window is maximized
  m_maximizedFrame = newFrame;
  return newFrame;
}

- (BOOL)windowShouldZoom:(NSWindow*)window
                 toFrame:(NSRect)newFrame
{
  // The NSWindow is going to be maximized...
  if (NSEqualRects(newFrame, m_maximizedFrame)) {
    // Save the frame before it's maximized
    m_restoredFrame = [window frame];
  }
  return YES;
}
@end

m_restoredFrame 仅在此后未调整窗口大小时才有效(即[window isZoomed] 必须为真)。不知道有没有更好的办法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多