可可窗口位置异常

Mar*_*ius 10 cocoa objective-c nswindow

我在屏幕上定位一个窗口有一个奇怪的问题.我想将窗口置于屏幕中央,但我不知道该怎么做.这就是我所拥有的.该窗口由主控制器从笔尖创建:

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"];
[[ftf window] makeKeyAndOrderFront:self];
Run Code Online (Sandbox Code Playgroud)

现在,IdentFormController具有awakeFromNib()方法,在该方法中它尝试定位窗口.为了简单起见,我只是尝试做setFrameOrigin(NSMakePoint(0,0)).会发生什么如下:

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

unk*_*ain 13

据我所知,你想把窗口置于屏幕中心?

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

[window center];
Run Code Online (Sandbox Code Playgroud)

这是最好的方法,但它会考虑到视觉重量和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];
Run Code Online (Sandbox Code Playgroud)

这段代码是未经测试的,但是它让你很清楚你需要做些什么才能让这个东西以你想要的方式工作,我个人建议你坚持使用Apple的代码,因为它已经过测试,是用户希望看到的,从设计角度来看,作为设计师,我自己并不总是依赖于实际的中心,而是光学中心所在的位置.


uli*_*ess 5

你可能会碰到自动窗口定位.你试过打电话吗?

[myWindowController setShouldCascadeWindows: NO];
Run Code Online (Sandbox Code Playgroud)


ben*_*ado 1

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

awakeFromNib在笔尖中的所有对象都已取消归档并且插座已连接后调用,但这对于设置窗口坐标可能还为时过早。我相信 Cocoa 做了一些工作来自动将后续窗口定位在现有窗口的下方和右侧,以便新窗口不会完全遮盖旧窗口。它可能会在您在 awakeFromNib 中设置位置后执行此操作,并踩踏您的更改。

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