我正在开发一个mac应用程序,我喜欢让初始窗口处于最大化状态,就像你按下带加号的绿色按钮一样。 我不希望它是全屏的。
答案 0 :(得分:9)
处于缩放状态的应用与“最大化”不同。绿色加号图标表示缩放,表示“此内容的适当大小”。在某些应用程序中,这是可见的框架(正如Eric D.讨论的那样),但它几乎可以是任何东西。例如,尝试缩放Safari窗口。
假设你真的想要“最大化”而不是“缩放”,那么Eric在正确的轨道上,但它可以做得更好。首先,你应该使用窗口的屏幕(如果有的话)。此外,您不应在启动期间为窗口调整大小设置动画(因为在启动时看起来很尴尬)。
func applicationDidFinishLaunching(aNotification: NSNotification) {
if let screen = window.screen ?? NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true)
}
}
您可能需要考虑使用NSWindowController
来管理它,而不是将其放在应用程序委托中。在这种情况下,您可以将其放在windowDidLoad
中。窗口控制器是AppKit中非常常见的工具(与视图控制器相反,它在历史上并不常见)。
如果您确实需要缩放行为,请熟悉NSWindowDelegate
方法windowWillUseStandardFrame(_:defaultFrame:)
。你通常不应该在启动时直接调用zoom(_:)
因为它会动画,但是你在委托中做的任何逻辑都应该用来计算你的帧。再次,确保调整框架以在窗口的屏幕上显示,如果它有一个,而不是主屏幕。
理想情况下,您应该尊重用户使用的最后一帧而不是强制它到可见帧。如果你想研究更多,那就在Cocoa中称为frameAutosave
。如果您只是在Interface Builder中设置自动保存名称,窗口控制器将帮助您稍微自动管理。 (虽然由于需要在首次启动时计算帧以获得可见帧,但稍微复杂一点,因此它不会完全自动化。)
在任何情况下使默认框架成为可见框架之前,请仔细考虑。这在大型显示器上可能真的很大(那里仍然有很多30英寸的Cinema显示器,但即使在27英寸显示器上也可能非常强大)。有时这很好,取决于你的应用程序,但我经常发现值得定义一个最大的初始大小(同时允许用户使其更大)。
答案 1 :(得分:7)
你可以"缩放"使用NSScreen的visibleFrame
作为目标框架,指向最大可用空间的窗口。让我们说window
是您的NSWindow IBOutlet:
if let screen = NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true, animate: true)
}
例如,在AppDelegate.swift中:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(aNotification: NSNotification) {
if let screen = NSScreen.mainScreen() {
window.setFrame(screen.visibleFrame, display: true, animate: true)
}
}
答案 2 :(得分:1)
在Swift 4.2中:
class ViewController: NSViewController {
override func viewDidAppear() {
super.viewDidAppear()
view.window?.zoom(self) //bespread the screen
//view.window?.toggleFullScreen(self) //fullscreen
}
答案 3 :(得分:1)
2020年| SWIFT 5.1:
使用扩展名:
extension NSWindowController {
func maximize() {
self.window?.zoom(self)
}
}
只需调用NSWindowController实例的maximize()
即可:)
答案 4 :(得分:1)
雨燕5
如果仍然有问题,请尝试将zoom函数调用为主线程。为我工作。
DispatchQueue.main.async {
self.view.window?.zoom(self)
}
答案 5 :(得分:0)
嗨,大家好,非常感谢你的帮助。
我正在开发基于文档的mac应用程序。我把你提供的代码放在Document类的makeWindowControllers()中,它就像魅力一样。
非常感谢你。这是我使用的代码。
override func makeWindowControllers() {
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: "Main", bundle: nil)
let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController
self.addWindowController(windowController)
if let screen = NSScreen.mainScreen() {
windowController.window?.setFrame(screen.visibleFrame, display: true, animate: true)
}
}