2014-12-20 20 views
7

Sto lavorando su Xcode 6.1.1 su OSX 10.10. Sto provando gli storyboard per le app Mac. Ho un NSTabViewController che utilizza il nuovo NSTabViewControllerTabStyleToolbartabStyle ed è impostato come controller di visualizzazione predefinito per il controller della finestra. Come posso ridimensionare la mia finestra in base all'attuale controller di visualizzazione selezionato?Ridimensionamento della finestra per visualizzare le dimensioni del controller nello storyboard

È possibile eseguire interamente in Interface Builder? Ecco ciò che il mio storyboard assomiglia: storyboard

risposta

10

La risposta del layout automatico è metà. È necessario impostare il preferito ContentSize nel ViewController per ogni scheda in base alla dimensione del raccordo (se si desidera che la scheda riduca alle dimensioni più piccole soddisfacendo tutti i vincoli).

override func viewWillAppear() { 
     super.viewWillAppear() 
     preferredContentSize = view.fittingSize 
} 

Se i vincoli stanno causando un problema sotto provare prima con una dimensione fissa, l'esempio seguente imposta questo in funzione viewWillAppear del controller della vista dell'elemento scheda (Swift qui utilizzato, ma la versione Objective-C funziona altrettanto bene).

override func viewWillAppear() { 
     super.viewWillAppear() 
     preferredContentSize = NSSize(width: 400, height: 280) 
} 

Se funziona, violino con i vostri vincoli di capire cosa sta succedendo

+1

Funziona, ma non viene visualizzato il cambiamento dell'altezza di visualizzazione animato. Si ridisegna da solo con le nuove dimensioni quando è selezionata la scheda pertinente. C'è qualche trucco per supportare il cambio di altezza animato? – mixtly87

-2

Usa autolayout. Imposta vincoli di dimensioni esplicite sulle tue visualizzazioni. Oppure, una volta che hai inserito l'interfaccia utente in ogni visualizzazione delle schede, la vista dell'elemento imposta i vincoli interni in modo tale da forzare la visualizzazione alla dimensione desiderata.

+2

L'aggiunta di vincoli ai controller della vista contenuta non ridimensiona la finestra. –

0

Questa soluzione per scheda vista controllori stile barra degli strumenti 'non animare e sostiene il piacevole effetto di dissolvenza incrociata. Nella finestra di progettazione dello storyboard, aggiungere "TabViewController" nel campo del nome classe personalizzato di NSTabViewController. Non dimenticare di assegnare un titolo a ogni viewController, questo viene utilizzato come valore chiave.

import Cocoa 

class TabViewController: NSTabViewController { 

    private lazy var tabViewSizes: [String : NSSize] = [:] 

    override func viewDidLoad() { 
     // Add size of first tab to tabViewSizes 
     if let viewController = self.tabViewItems.first?.viewController, let title = viewController.title { 
      tabViewSizes[title] = viewController.view.frame.size 
     } 
     super.viewDidLoad() 
    } 

    override func transition(from fromViewController: NSViewController, to toViewController: NSViewController, options: NSViewController.TransitionOptions, completionHandler completion: (() -> Void)?) { 

     NSAnimationContext.runAnimationGroup({ context in 
      context.duration = 0.5 
      self.updateWindowFrameAnimated(viewController: toViewController) 
      super.transition(from: fromViewController, to: toViewController, options: [.crossfade, .allowUserInteraction], completionHandler: completion) 
     }, completionHandler: nil) 
    } 

    func updateWindowFrameAnimated(viewController: NSViewController) { 

     guard let title = viewController.title, let window = view.window else { 
      return 
     } 

     let contentSize: NSSize 

     if tabViewSizes.keys.contains(title) { 
      contentSize = tabViewSizes[title]! 
     } 
     else { 
      contentSize = viewController.view.frame.size 
      tabViewSizes[title] = contentSize 
     } 

     let newWindowSize = window.frameRect(forContentRect: NSRect(origin: NSPoint.zero, size: contentSize)).size 

     var frame = window.frame 
     frame.origin.y += frame.height 
     frame.origin.y -= newWindowSize.height 
     frame.size = newWindowSize 
     window.animator().setFrame(frame, display: false) 
    } 
} 
Problemi correlati