我有一个Xcode中作为SpriteKit / GameScene应用程序创建的准系统项目。我想以编程方式设置窗口大小。我在这里读了很多答案,在其他地方也读了一些教程,但是我读过的东西都没有帮助。
This answer讨论了覆盖Post::with([ 'revisions' => function($query) {
$query->orderBy('created_at', 'desc')->where('status', 'approved')->limit(1);
}])->get()->filter(function($item) {
return $item->revisions->count() > 0;
});
,但是GameScene并没有给我WindowController.windowDidLoad
。它确实给了我WindowController
。 This tutorial说您可以从ViewController
呼叫self.view.window?.setFrame()
,但是我的窗口固执地保持不变。我在SO上找到的许多答案都在谈论自动布局。我没有什么可布置的。这只是一个SpriteKit入门项目。
This answer说,您可以在ViewController.viewDidLoad()
中设置preferredContentSize
,实际上这确实允许我设置窗口大小,但是如果我将窗口设置得太大(因为我不得不猜测以合理的大小),它不可拖动或调整大小。 This answer表示您可以从ViewController.viewWillAppear()
获得正确的尺寸,但这表示800 x 600,这远不及我的屏幕尺寸。 This answer说,您可以从view.bounds.size
获得限制,但是我的GameScene / SpriteKit入门项目似乎没有任何类型的UIScreen.mainScreen().bounds.size
。
如何获取屏幕尺寸以及如何以编程方式设置窗口尺寸和位置?
另外,我似乎找不到更多的答案之一,我说你应该删除UIScreen
,我这样做了,除了大小,一切似乎还不错。
答案 0 :(得分:1)
如果您希望在那里实现它,请记住将 NSWindowDelegate
添加到您的 NSViewController
类中(即 viewDidLoad()
、viewWillAppear()
、viewDidAppear()
等)
class ViewController: NSViewController, NSWindowDelegate {
override func viewWillAppear() {
fillWindow()
}
/// Sizes window to fill max screen size
func fillWindow() {
if let screenSize = view.window?.screen?.frame {
view.window!.setFrame(screenSize, display: true)
}
}
}
class WindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
fillWindow()
}
/// Sizes window to fill max screen size
func fillWindow() {
if let screenSize = window?.screen?.frame {
window!.setFrame(screenSize, display: true)
}
}
}
打印到调试器控制台
print(screenSize) // embed within if let screenSize { ... }
查看完整答案,以及实现的代码,here。
extension NSWindow {
/// Positions the `NSWindow` at the horizontal-vertical center of the `visibleFrame` (takes Status Bar and Dock sizes into account)
public func positionCenter() {
if let screenSize = screen?.visibleFrame.size {
self.setFrameOrigin(NSPoint(x: (screenSize.width-frame.size.width)/2, y: (screenSize.height-frame.size.height)/2))
}
}
/// Centers the window within the `visibleFrame`, and sizes it with the width-by-height dimensions provided.
public func setCenterFrame(width: Int, height: Int) {
if let screenSize = screen?.visibleFrame.size {
let x = (screenSize.width-frame.size.width)/2
let y = (screenSize.height-frame.size.height)/2
self.setFrame(NSRect(x: x, y: y, width: CGFloat(width), height: CGFloat(height)), display: true)
}
}
/// Returns the center x-point of the `screen.visibleFrame` (the frame between the Status Bar and Dock).
/// Falls back on `screen.frame` when `.visibleFrame` is unavailable (includes Status Bar and Dock).
public func xCenter() -> CGFloat {
if let screenSize = screen?.visibleFrame.size { return (screenSize.width-frame.size.width)/2 }
if let screenSize = screen?.frame.size { return (screenSize.width-frame.size.width)/2 }
return CGFloat(0)
}
/// Returns the center y-point of the `screen.visibleFrame` (the frame between the Status Bar and Dock).
/// Falls back on `screen.frame` when `.visibleFrame` is unavailable (includes Status Bar and Dock).
public func yCenter() -> CGFloat {
if let screenSize = screen?.visibleFrame.size { return (screenSize.height-frame.size.height)/2 }
if let screenSize = screen?.frame.size { return (screenSize.height-frame.size.height)/2 }
return CGFloat(0)
}
}
将现有窗口定位到可见框的中心。
window!.positionCenter()
在visibleFrame的中心设置一个带有尺寸的新窗口框架
window!.setCenterFrame(width: 900, height: 600)
使用 xCenter()
和 yCenter()
获得 visibleFrame
的中心 x-y 点。
let x = self.view.window?.xCenter() ?? CGFloat(0)
let y = self.view.window?.yCenter() ?? CGFloat(0)
self.view.window?.setFrame(NSRect(x: x, y: y, width: CGFloat(900), height: CGFloat(600)), display: true)
答案 1 :(得分:0)
如果一些UI大师可以评论这是否是“正确的”答案,那就太棒了,但这是我根据“ El Tomato's”而不是神秘的评论做出的疯狂猜测。首先,将以下内容添加到ViewController.swift:
class WildGuessWindowController: NSWindowController {
override func windowDidLoad() {
if let screenSize = window?.screen?.frame {
window!.setFrame(screenSize, display: true)
print(screenSize)
}
super.windowDidLoad()
}
}
接下来,在项目导航器中打开Main.storyboard。您可能会看到类似以下的内容:
单击显示“窗口控制器”的框,然后打开右侧面板。您应该会看到类似这样的内容。
请注意箭头旁边的框,其中带有灰色的类名称。 (还请注意,您可能必须单击“身份检查器”按钮,上面蓝色的按钮显示“自定义类别”。)现在单击该下拉列表,您应该看到WildGuessWindowController
。选择它,您就设置好了。生成并运行。该框架将实例化您的类,并运行windowDidLoad()
。