Ren*_*ahl 6 cocoa osx-yosemite
我有一个要显示为模式窗口的窗口(OS X 10.10)。我正在为窗口加载 NIB,并且能够成功设置标题,然后显示窗口。但是无论我做什么试图影响窗口位置都不起作用。
这有效(NSWindowController 子类的一部分):
[[self window] setTitle:title];
[[NSApplication sharedApplication] runModalForWindow:[self window]];
Run Code Online (Sandbox Code Playgroud)
以下是我在设置标题后尝试影响位置的方法:
[[self window] setFrameOrigin: NSMakePoint(200.0, 200.0) ];
[[self window] setFrameTopLeftPoint: NSMakePoint(200.0, 200.0) ];
[[self window] setFrame: NSMakeRect(200, 300, [[self window] frame].size.width, [[self window] frame].size.height) display:YES];
Run Code Online (Sandbox Code Playgroud)
(我也尝试过其他值 - 仅用于测试,但什么都没有。)
我什至可以查询
[[self window] frame]
Run Code Online (Sandbox Code Playgroud)
它假装接受新值,但窗口顽固地一直显示在同一位置。
是什么赋予了?
我已经解决了这个问题
1-创建一个新的 NSWindow 子类,重写 center 方法,您只需将新窗口的框架定位在您想要的任何 NSPoint 处:
class CenteredInParentWindow: NSWindow {
var parentMinX : CGFloat?
var parentMinY : CGFloat?
override func center() {
guard let parentMinX = parentMinX, let parentMinY = parentMinY else {
super.center()
return
}
self.setFrameOrigin(NSPoint(x: parentMinX, y: parentMinY))
}
}
Run Code Online (Sandbox Code Playgroud)
2 - 在 Storyboard 中将 WindowController 的窗口类设置为新的 NSWindow 子类。
3-实例化窗口控制器并设置子类窗口的属性
let myWindowController = self.storyboard!.instantiateController(withIdentifier: "windowID") as! PlansWindowController
if let customWindow = myWindowController.window as? CenteredInParentWindow {
customWindow.parentMinX = NSApplication.shared.mainWindow?.frame.minX
customWindow.parentMinY = NSApplication.shared.mainWindow?.frame.minY
}
NSApp.runModal(for: myWindowController.window!)
}
Run Code Online (Sandbox Code Playgroud)
您可能需要runModal一种使窗口成为模态窗口的方法。不要忘记包含在视图控制器中可用的方法NSApp.stopModal()中windowWillCloseNSWindowDelegate