10

我在屏幕上定位一个窗口时遇到了一个奇怪的问题。我想在屏幕上居中窗口,但我不知道该怎么做。这就是我所拥有的。窗口由主控制器从 nib 创建:

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"];
[[ftf window] makeKeyAndOrderFront:self];

现在 IdentFormController 有 awakeFromNib() 方法,它试图定位窗口。为了简单起见,我只是尝试做 setFrameOrigin(NSMakePoint(0, 0))。发生的情况如下:

我第一次创建这个窗口时,一切都按预期工作。但是如果我在释放前一个之后再次创建它,它就会开始出现在随机位置。为什么这样做?

4

4 回答 4

14

所以据我了解,您想将窗口居中放在屏幕上吗?

那么假设NSWindow *window是你的窗口对象,那么有两种方法......

[window center];

这是做到这一点的最佳方式,但它会考虑到视觉重量和 Dock 的存在。

如果你想要死点,那么这将工作......

// Calculate the actual center
CGFloat x = (window.screen.frame.size.width - window.frame.size.width) / 2;
CGFloat y = (window.screen.frame.size.height - window.frame.size.height) / 2;

// Create a rect to send to the window
NSRect newFrame = NSMakeRect(x, y, window.frame.size.width, window.frame.size.height);

// Send message to the window to resize/relocate
[window setFrame:newFrame display:YES animate:NO];

这段代码未经测试,但它让你清楚地知道你需要做什么才能让这件事以你想要的方式工作,我个人建议你坚持使用 Apple 的代码,因为它已经过测试并且是用户期望看到的,同样从设计的角度来看,作为一名设计师,我并不总是依赖实际中心来作为光学中心所在的位置。

于 2010-04-07T23:21:27.490 回答
5

您可能与自动窗口定位发生冲突。你试过打电话吗

[myWindowController setShouldCascadeWindows: NO];

?

于 2010-04-10T13:06:58.790 回答
1

首先,听起来您需要在 NSWindow 的属性检查器中检查“关闭时释放”或“关闭时释放”。然后窗口将自行清理,您可以[self release]在自己的代码中删除(有风险的)调用。

awakeFromNib在 nib 中的所有对象都已取消存档并且插座已连接后调用,但这可能为时过早,无法设置窗口坐标。我相信 Cocoa 做了一些工作来自动将后续窗口定位在现有窗口的下方和右侧,这样新窗口就不会完全掩盖旧窗口。在您在 awakeFromNib 中设置位置之后,很可能会这样做,踩踏您的更改。

设置窗口位置的最佳位置可能是在 NSWindow 委托方法之一中(windowWillBecomeVisible:也许),或者可能就在您调用makeKeyAndOrderFront:.

于 2010-02-13T17:01:55.980 回答
0

检查是否可以将窗口的中心设置为屏幕的中心。并在其上设置窗口位置。它可能会奏效。

于 2010-03-12T06:58:39.833 回答