2014-12-20 4 views
7

Ich arbeite an Xcode 6.1.1 unter OSX 10.10. Ich probiere Storyboards für Mac-Apps aus. Ich habe einen NSTabViewController mit dem neuen NSTabViewControllerTabStyleToolbartabStyle und es ist als Standard-View-Controller für den Fenster-Controller festgelegt. Wie ändere ich die Größe meines Fensters entsprechend dem aktuell ausgewählten View-Controller?Fenstergröße ändern, um Controllergröße im Storyboard anzuzeigen

Ist es möglich, vollständig in Interface Builder zu tun? Hier ist, was mein Drehbuch aussieht: storyboard

Antwort

10

Die automatische Layout-Antwort ist die Hälfte davon. Sie müssen die preferredContentSize in Ihrem ViewController für jede Registerkarte auf die Anpassungsgröße festlegen (wenn Sie möchten, dass die Registerkarte auf die kleinste Größe mit allen Einschränkungen skaliert wird).

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

Wenn Ihre Einschränkungen unten ein Problem verursachen zunächst versuchen, mit einer festen Größe, Beispiel unten setzt dies in dem viewWillAppear Funktion Ansicht Controllers Registerkarte Artikels (Swift hier verwendet, aber die Objective-C-Version funktioniert genauso gut).

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

Wenn das funktioniert, Geige mit Einschränkungen, um herauszufinden, was los ist

+1

Das funktioniert, aber ich bekomme keine Änderung der Ansichtshöhe animiert. Es wird nur mit der neuen Größe neu gezeichnet, wenn die entsprechende Registerkarte ausgewählt ist. Gibt es einen Trick zur Unterstützung der animierten Höhenänderung? – mixtly87

-2

Verwenden Automatisches Layout. Legen Sie explizite Größenbeschränkungen für Ihre Ansichten fest. Oder wenn Sie die Benutzeroberfläche in die einzelnen Ansichten eines Registerkartenelements eingegeben haben, legen Sie die internen Einschränkungen so fest, dass sie die Ansicht auf die gewünschte Größe zwingen.

+2

Durch das Hinzufügen von Einschränkungen zu den Containern der enthaltenen Ansicht wird die Größe des Fensters nicht geändert. –

0

Diese Lösung für ‚Symbolleiste Stil‘ Registerkarte Ansicht-Controller nicht animiert und unterstützt den schönen Übergangseffekt. Fügen Sie im Storyboard-Designer "TabViewController" in das Feld für den benutzerdefinierten Klassennamen von NSTabViewController ein. Vergessen Sie nicht, jedem ViewController einen Titel zuzuweisen, der als Schlüsselwert verwendet wird.

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