我正在使用OSX 10.10上的Xcode 6.1.1。我正在尝试Mac应用程序的故事板。我有一个NSTabViewController使用新的NSTabViewControllerTabStyleToolbar
tabStyle
,它被设置为窗口控制器的默认视图控制器。 如何根据当前选定的视图控制器调整窗口大小?调整窗口大小以查看故事板中的控制器大小
完全可以在Interface Builder中完成吗? 这里是我的故事板是什么样子:
我正在使用OSX 10.10上的Xcode 6.1.1。我正在尝试Mac应用程序的故事板。我有一个NSTabViewController使用新的NSTabViewControllerTabStyleToolbar
tabStyle
,它被设置为窗口控制器的默认视图控制器。 如何根据当前选定的视图控制器调整窗口大小?调整窗口大小以查看故事板中的控制器大小
完全可以在Interface Builder中完成吗? 这里是我的故事板是什么样子:
自动布局答案是它的一半。您需要将ViewController中的preferredContentSize设置为每个选项卡的大小(如果您希望选项卡大小为满足所有限制的最小大小)。
override func viewWillAppear() {
super.viewWillAppear()
preferredContentSize = view.fittingSize
}
如果你的约束造成的问题下面尝试先用一个固定大小的,下面的标签项的视图控制器viewWillAppear中的功能设置此(斯威夫特这里使用的例子,但Objective-C的版本的作品一样好)。
override func viewWillAppear() {
super.viewWillAppear()
preferredContentSize = NSSize(width: 400, height: 280)
}
如果这样的作品,拨弄你的约束要弄清楚这是怎么回事
使用自动布局。为你的视图设置明确的大小限制。或者一旦你在每个标签视图项目的视图中输入了UI,就可以设置内部约束,以便强制视图成为你想要的大小。
向包含的视图控制器添加约束不会调整窗口的大小。 –
该解决方案“工具栏式”标签视图控制器没有动画,并支持漂亮的交叉淡入淡出效果。在故事板设计器中,在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)
}
}
这有效,但我没有得到视图高度变化动画。它只是在选择相关选项卡时重新绘制新尺寸。是否有任何技巧支持动画高度变化? – mixtly87