【问题标题】:Centred resizing with NSWindow使用 NSWindow 居中调整大小
【发布时间】:2012-10-14 17:31:06
【问题描述】:

我有一个 NSWindow,它位于 NSStatusItem 的位置。 窗口可以使用它自己的方法setSize: 来改变它的大小,这样就可以得到正确的窗口框架:

- (NSRect)frameForSize:(NSSize)size {
    NSRect newFrame = self.frame;
    newFrame.origin.x += (newFrame.size.width - size.width) / 2;
    newFrame.origin.y += (newFrame.size.height - size.height);
    newFrame.size = size;

    return newFrame;
}

如果宽度发生变化,这允许窗口保持居中。 我可以使用代码轻松调用它,但是当我使用窗口边缘调整它的大小时,直接调用 setFrame:display:。 有一个委托方法windowDidResize:notification:,但是如果我在那里设置框架,它会被设置两次并且它会滞后。

在实际调整窗口大小之前是否有一个事件被调用? 如果没有,我该怎么做?

【问题讨论】:

  • 您是否尝试过继承 NSWindow 并覆盖 setFrame:display: 以保持窗口居中?
  • 我已经对窗口进行了子类化,问题是在这种情况下我无法设置原点。
  • 见我的answer below。您可以设置原点,因为您将使用新尺寸的正确(居中)原点在 super 上调用 setFrame:display:

标签: objective-c xcode macos cocoa nswindow


【解决方案1】:

根据您的above comment,您已将NSWindow 子类化。假设您的方法 -frameForSize: 在您的 NSWindow 子类上,请按如下方式覆盖 -[NSWindow setFrame:display:]

- (void)setFrame:(NSRect)frameRect display:(BOOL)flag
{
    frameRect = (self.inLiveResize) ? [self frameForSize:frameRect.size] : frameRect;
    [super setFrame:frameRect display:flag];
}

我已经对此进行了测试。窗口将平滑调整大小并始终居中。

【讨论】:

  • 确实如此,我知道。我以前也遇到过这个解决方案。问题是我永远无法设置默认原点。当面板打开时,它的原点已设置,因此它显示在 NSStatusItem 的正下方。如果我重写 setFrame:display: 方法,窗口将停留在初始化的位置,即屏幕中间。
  • 但我非常感谢您的帮助,因此 +1 :)
  • 您能否发布屏幕截图,说明当您像上面那样覆盖setFrame:display: 和不覆盖时会发生什么?当您覆盖该方法时,我不清楚发生了什么不受欢迎的事情......
  • 虽然我不同意它“非常混乱”,但我同意它引入了潜在的错误 - 或者更准确地说,是意想不到的行为 - 在你之后很久已经完成了这个窗口的编写。也许您只想在窗口从-inLiveResize 返回YES 时保持居中?我已经相应地调整了我的答案。
  • 谢谢!我使用了面板属性 self.isAnimating 和 self.isVisible。可惜我自己没有来这个解决方案。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多