2015-12-16 22 views

risposta

5

È possibile "ingrandire" una finestra fino allo spazio massimo disponibile utilizzando il valore NSScreen visibleFrame come frame di destinazione. Diciamo che è il tuo window NSWindow IBOutlet:

if let screen = NSScreen.mainScreen() { 
    window.setFrame(screen.visibleFrame, display: true, animate: true) 
} 

Ad esempio, nel 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) 
     } 
    } 
+0

Scusa, sono molto nuovo nel mondo mac. Ho appena inserito questo codice in NSViewController: viewDidLoad e non funziona, puoi dirmi dove mettere esattamente questo codice.questo è il mio codice se let screen = NSScreen.mainScreen() { self.view.window? .setFrame (screen.visibleFrame, display: true, animate: true) } –

+0

Ho aggiornato la mia risposta con un esempio. – Moritz

+1

Aggiornamento per Swift 3: basta sostituire '.mainScreen()' con '.main()'. – Moritz

6

Un'applicazione nel suo stato di zoom non è la stessa cosa come "massimizzato." L'icona più verde indica lo zoom, che significa "la dimensione appropriata per questo contenuto". In alcune applicazioni questa è la cornice visibile (come discute Eric D.), ma può essere quasi tutto. Prova ad ingrandire una finestra di Safari, per esempio.

Supponendo che tu voglia veramente "ingrandito" e non "zoom", allora Eric è sulla strada giusta, ma può essere fatto meglio. Per prima cosa, dovresti usare lo schermo della finestra se ne ha uno. Inoltre, non devi animare il ridimensionamento della finestra durante il lancio (dal momento che può sembrare strano all'avvio).

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    if let screen = window.screen ?? NSScreen.mainScreen() { 
     window.setFrame(screen.visibleFrame, display: true) 
    } 
} 

Si consiglia di considerare l'utilizzo di un NSWindowController per gestire questo piuttosto che metterlo nel delegato applicazione. In tal caso, è possibile inserirlo in windowDidLoad. I controller di finestre sono uno strumento piuttosto comune in AppKit (al contrario dei controller di visualizzazione, che non sono storicamente comuni).

Se si desidera effettivamente il comportamento di zoom, familiarizzare con il metodo NSWindowDelegatewindowWillUseStandardFrame(_:defaultFrame:). Generalmente non si dovrebbe chiamare zoom(_:) direttamente all'avvio perché questo si animerà, ma qualunque logica si faccia nel delegato dovrebbe essere usata per calcolare il frame. Anche in questo caso, assicurati di regolare la cornice per vivere sullo schermo della finestra, se ne ha uno, piuttosto che la schermata principale.

Idealmente, dovresti davvero rispettare l'ultimo fotogramma usato dall'utente piuttosto che forzarlo nel fotogramma visibile. Si chiama frameAutosave a Cocoa se vuoi fare ulteriori ricerche. Un controller di finestra ti aiuterà a gestirlo in modo un po 'automatico se imposti un nome di salvataggio automatico in Interface Builder. (Anche se è leggermente complicato, è necessario calcolare il fotogramma al primo avvio per ottenere il fotogramma visibile, quindi non sarà completamente automatico.)

Rifletti attentamente prima di rendere il fotogramma predefinito come cornice visibile in qualsiasi Astuccio. Questo può essere davvero enorme su monitor di grandi dimensioni (ci sono ancora un sacco di 30 "Cinema display là fuori, ma anche su un 27" può essere piuttosto travolgente). A volte va bene a seconda della tua app, ma spesso trovo che valga la pena di definire una dimensione iniziale massima (pur consentendo all'utente di ingrandirla).

0

Ciao Ragazzi, ho davvero apprezzato il tuo aiuto.

Sto lavorando a un'applicazione mac basata su documenti. Inserisco il codice che hai fornito nel makeWindowControllers() della classe Document e funziona come un incantesimo.

Grazie mille. Ecco il codice che uso.

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) 
     } 
    }