2014-12-20 26 views
7

Pracuję nad Xcode 6.1.1 na OS X 10.10. Próbuję tworzyć storyboardy dla aplikacji na komputery Mac. Mam NSTabViewController przy użyciu nowego NSTabViewControllerTabStyleToolbartabStyle i jest ustawiony jako domyślny kontroler widoku dla kontrolera okien. Jak zmienić rozmiar okna zgodnie z bieżącym wybranym kontrolerem widoku?Zmiana rozmiaru okna w celu wyświetlenia rozmiaru kontrolki w scenorysie

Czy można w pełni wykonać narzędzie do tworzenia interfejsu? Oto co mój storyboard wygląda następująco: storyboard

Odpowiedz

10

Odpowiedź układu automatycznego to połowa. Musisz ustawić preferowanąContentsSize w swoim ViewController dla każdej zakładki na rozmiar dopasowania (jeśli chcesz, żeby zakładka była wielkością najmniejszego rozmiaru spełniającego wszystkie ograniczenia).

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

Jeśli ograniczenia są przyczyną problemu poniżej spróbuj najpierw o stałej wielkości, na przykład poniżej przedstawia to w funkcji pozycji tabulatora widok kontrolera viewWillAppear (Swift używane tutaj, ale wersja Objective-C działa tak samo dobrze).

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

Jeśli to działa, skrzypce ze swoimi ograniczeniami, aby dowiedzieć się, co się dzieje

+1

To działa, ale nie widzę animacji zmiany wysokości. Po prostu odrysowuje się z nowym rozmiarem po wybraniu odpowiedniej karty. Czy istnieje jakaś sztuczka wspierająca animowaną zmianę wysokości? – mixtly87

-2

Zastosowanie autoLayout. Ustaw wyraźne ograniczenia rozmiaru na widokach użytkownika. Lub po wprowadzeniu interfejsu użytkownika do każdego widoku elementu widoku karty, ustaw wewnętrzne wiązania tak, aby wymuszały one wyświetlanie w żądanym rozmiarze.

+2

Dodanie wiązań do zawartych kontrolerów widoku nie zmienia rozmiaru okna. –

0

To rozwiązanie typu „Pasek” kartę Widok kontrolerów ma żywej i wspiera ładny efekt przenikania. W projektorze storyboardów dodaj "TabViewController" w polu niestandardowej nazwy klasy kontrolera NSTabViewController. Nie zapomnij o przypisaniu tytułu do każdego kontrolera viewController, jest to używane jako wartość klucza.

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