Kau*_*eya 11 macos cocoa storyboard appkit
我正在OSX 10.10上开发Xcode 6.1.1.我正在为Mac应用程序试用故事板.我有一个使用new的NSTabViewController NSTabViewControllerTabStyleToolbar tabStyle,它被设置为窗口控制器的默认视图控制器.如何根据当前选定的视图控制器调整窗口大小?
是否可以完全在Interface Builder中完成?这是我的故事板的样子:

rou*_*ter 12
自动布局答案是它的一半.您需要在每个选项卡的ViewController中将preferredContentSize设置为拟合大小(如果您希望选项卡大小为满足所有约束的最小大小).
override func viewWillAppear() {
super.viewWillAppear()
preferredContentSize = view.fittingSize
}
Run Code Online (Sandbox Code Playgroud)
如果您的约束导致下面的问题首先尝试使用固定大小,下面的示例在选项卡项的视图控制器的viewWillAppear函数中设置它(此处使用Swift,但Objective-C版本也可以正常工作).
override func viewWillAppear() {
super.viewWillAppear()
preferredContentSize = NSSize(width: 400, height: 280)
}
Run Code Online (Sandbox Code Playgroud)
如果可行,请调整您的约束以弄清楚发生了什么
“工具栏样式”选项卡视图控制器的此解决方案确实具有动画效果并支持漂亮的淡入淡出效果。在故事板设计器中,在 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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7654 次 |
| 最近记录: |