我正在使用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