2014-12-20 3 views
7

Я работаю над Xcode 6.1.1 на OSX 10.10. Я пытаюсь раскадровки для приложений Mac. У меня есть NSTabViewController, используя новый NSTabViewControllerTabStyleToolbartabStyle, и он установлен как контроллер представления по умолчанию для оконного контроллера. Как изменить размер окна в соответствии с текущим выбранным контроллером?Изменение размера окна для просмотра размера контроллера в раскадровке

Возможно ли это сделать полностью в интерфейсе Builder? Вот что моя раскадровки выглядит следующим образом: storyboard

ответ

10

Ответ авто макета - половина его. Вам нужно установить preferredContentSize в вашем ViewController для каждой вкладки на размер фитинга (если вы хотите, чтобы вкладка имела размер с наименьшим размером, удовлетворяющим всем ограничениям).

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

Если ваши ограничения вызывают вопрос ниже попробовать сначала с фиксированным размером, в приведенном ниже примере множества это в функции viewWillAppear зрения контроллера на вкладке элемента (Swift, используемые здесь, но версия Objective-C работает так же хорошо).

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

Если это работает, скрипку с ограничениями, чтобы выяснить, что происходит

+1

Это работает, но я не получаю анимированное изменение высоты просмотра. Он просто перерисовывается с новым размером, когда выбрана соответствующая вкладка. Есть ли трюк для поддержки анимированного изменения высоты? – mixtly87

-2

Использование autolayout. Установите ограниченные ограничения размера для ваших представлений. Или, как только вы ввели пользовательский интерфейс в каждый элемент представления вида табуляции, настройте внутренние ограничения, чтобы они принудительно отображали вид, который вы хотите.

+2

Добавление ограничений к содержащимся контроллерам представления не изменяет размер окна. –

0

Это решение для контроллеров отображения на вкладке «стиль панели инструментов» делает одушевленные и поддерживает хороший эффект перекрестной регулировки. В дизайнере раскадровки добавьте «TabViewController» в поле пользовательского имени класса NSTabViewController. Не забудьте назначить заголовок для каждого viewController, это используется как ключевое значение.

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

 Смежные вопросы

  • Нет связанных вопросов^_^