2014-12-20 53 views
7

我正在使用OSX 10.10上的Xcode 6.1.1。我正在尝试Mac应用程序的故事板。我有一个NSTabViewController使用新的NSTabViewControllerTabStyleToolbartabStyle,它被设置为窗口控制器的默认视图控制器。 如何根据当前选定的视图控制器调整窗口大小?调整窗口大小以查看故事板中的控制器大小

完全可以在Interface Builder中完成吗? 这里是我的故事板是什么样子: storyboard

回答

10

自动布局答案是它的一半。您需要将ViewController中的preferredContentSize设置为每个选项卡的大小(如果您希望选项卡大小为满足所有限制的最小大小)。

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

如果你的约束造成的问题下面尝试先用一个固定大小的,下面的标签项的视图控制器viewWillAppear中的功能设置此(斯威夫特这里使用的例子,但Objective-C的版本的作品一样好)。

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

如果这样的作品,拨弄你的约束要弄清楚这是怎么回事

+1

这有效,但我没有得到视图高度变化动画。它只是在选择相关选项卡时重新绘制新尺寸。是否有任何技巧支持动画高度变化? – mixtly87

-2

使用自动布局。为你的视图设置明确的大小限制。或者一旦你在每个标签视图项目的视图中输入了UI,就可以设置内部约束,以便强制视图成为你想要的大小。

+2

向包含的视图控制器添加约束不会调整窗口的大小。 –

0

该解决方案“工具栏式”标签视图控制器没有动画,并支持漂亮的交叉淡入淡出效果。在故事板设计器中,在NSTabViewController的自定义类名称字段中添加“TabViewController”。不要忘记为每个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) 
    } 
}